XSLT - 重命名和移动元素到一个新的节点

问题描述:

我有下面的XML输入文件:XSLT - 重命名和移动元素到一个新的节点

<home> 
    <folders> 
     <folder uuid="uuid1"> 
      <name>folder1</name> 
      <member ref="refA" /> 
      <member ref="refB" /> 
     </folder> 
     <folder uuid="uuid2"> 
      <name>folder2</name> 
      <member ref="refC" /> 
      <member ref="refD" /> 
     </folder> 
     <folder uuid="uuid3"> 
      <name>folder3</name> 
      <member ref="refE" /> 
      <member ref="refF" /> 
     </folder> 
    </folders> 
</home> 

而且我有以下三种:

<home> 
    <folders> 
     <folder uuid="uuid1"> 
      <name>folder1</name> 
      <refNews> 
       <refNew ref="refA" /> 
       <refNew ref="refB" /> 
      </refNews> 
     </folder> 
     <folder uuid="uuid2"> 
      <name>folder2</name> 
      <refNews> 
       <refNew ref="refC" /> 
       <refNew ref="refD" /> 
      </refNews> 
     </folder> 
     <folder uuid="uuid3"> 
      <name>folder3</name> 
      <refNews> 
       <refNew ref="refE" /> 
       <refNew ref="refF" /> 
      </refNews> 
     </folder> 
    </folders> 
</home> 

要恢复:

  • “成员”元素变成“refNew”
  • 所有“refNew”元素都包含在新节点中“refNews”

我尝试几种XSLT模板,但我不能重新命名,并在同一个XSLT文件移动:-(

我需要你的帮助,谢谢。

问候, Zido

+0

我们希望您展示您的努力以获得帮助,我们通常不会从头开始写点东西。请显示您尝试过的xslt,并描述与您所需输出的不同之处 - 在我忘记之前,请通过编辑问题来完成,不要在此处留言中添加此信息 –

它总是更好地看到你有什么到目前为止并帮助解决地方它会错,但其实这是很容易的。试试这个:

<xsl:template match="folder"> 
    <xsl:copy> 
    <xsl:apply-templates select="@* | node()[not(self::member)]"/> 
    <refNews> 
     <xsl:apply-templates select="member"/> 
    </refNews> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="member"> 
    <refNew> 
    <xsl:apply-templates select="@* | node()"/> 
    </refNew> 
</xsl:template> 

如果你不想refNews元素,如果没有任何member S,你可以只包住refNews元素<xsl:if test="member"/>,或者更好的,有第一个模板匹配folder[member]

这假定您也有定义的身份模板。

+0

感谢Flynn,它完美运行。我明白我的错误:匹配“成员”,我一直在寻找refNews节点,但在第二个模板(match =“member”)中,refNews是未知的! – zido71