2011-11-30 60 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得到正确的答案。 –