如何使用XSL复制孩子

时间:2011-11-30 21:09:54

标签: xml xslt

如何使用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>标签。

感谢。

2 个答案:

答案 0 :(得分:3)

xsl:copy正在复制上下文项,在本例中为keyword。基本上你用现有的keyword包装新的。{/ p>

尝试删除xsl:copy

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

注意:您的最终输出将取决于您是否有其他模板来处理keyword的子项(如身份转换)。

您可以在此处找到有关复制和身份转换的更多信息:http://www.w3.org/TR/xslt#copying

答案 1 :(得分:3)

您无需使用keyword明确地输出keyword 复制现有xsl:copy。作为 @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>

来自评论:

  

...如果需要覆盖属性该怎么办?就像假设一样   'keyword'已经有'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>