2011-11-30 59 views
2

如何使用XSL複製兒童?如何使用XSL複製兒童

來源:

<body> 
    <keyword><i color="blue">super</i>man</keyword> 
    <keyword><i color="blue">super</i>man</keyword> 
    <keyword><i color="blue">super</i>woman</keyword> 
</body> 

我使用以下

<xsl:template match="keyword" > 
    <keyword> 
     <xsl:attribute name="type">Key Words Head First</xsl:attribute> 

     <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </keyword> 

    </xsl:template> 

當使用上面的代碼我得到雙重嵌套<keyword>標籤。

謝謝。

+1

什麼是源XML是什麼樣子? –

回答

3

你不需要輸出keyword明確使用xsl:copy複製現有keyword。作爲替代@DevNull的回答是:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="keyword"> 
     <xsl:copy> 
      <xsl:attribute name="type">Key Words Head First</xsl:attribute> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

...生成以下,當適用於您的輸入:

<body> 
    <keyword type="Key Words Head First"><i color="blue">super</i>man</keyword> 
    <keyword type="Key Words Head First"><i color="blue">super</i>man</keyword> 
    <keyword type="Key Words Head First"><i color="blue">super</i>woman</keyword> 
</body> 

從評論:

...如果該屬性需要被覆蓋,該怎麼辦?就像假設 '關鍵字'已經有'type'屬性。

在這種情況下,不復制現有type屬性:

<xsl:template match="keyword"> 
    <xsl:copy> 
     <xsl:attribute name="type">Key Words Head First</xsl:attribute> 
     <xsl:apply-templates select="@*[not(name()='type')]|node()"/> 
    </xsl:copy> 
</xsl:template> 
+0

謝謝。我在示例中沒有顯示,但如果屬性需要被覆蓋,該怎麼辦?就像假設'關鍵字'已經有'type'屬性一樣。我測試了你的代碼,並沒有覆蓋它。 – joe

+0

+1因爲我喜歡做它。這對OP來說比我的回答更有幫助。 –

+0

@joe - 查看我更新的答案,以忽略現有的@type。你也可以在@ lwburk的答案中使用相同的謂詞。 –

3

xsl:copy正在複製上下文項目,在本例中爲keyword。基本上你用新的包裝現有的keyword

嘗試刪除xsl:copy

<xsl:template match="keyword" > 
    <keyword type="Key Words Head First"> 
     <xsl:apply-templates select="node()|@*[name() != 'type']"/> 
    </keyword>  
    </xsl:template> 

注意:你的最終輸出將取決於你是否有其他模板來處理keyword的孩子(如恆等變換)。

你可以找到更多信息,複印和身份變換位置:

+0

+1 - 完美的答案。可以說更好,因爲它少了一行。我只是提供了我的證明,它可以通過兩種方式完成。 –

+0

+1得到正確的答案。 –