2016-06-08 78 views
0

我有下面的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,並描述與您所需輸出的不同之處 - 在我忘記之前,請通過編輯問題來完成,不要在此處留言中添加此信息 –

回答

1

它總是更好地看到你有什麼到目前爲止並幫助解決地方它會錯,但其實這是很容易的。試試這個:

<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