如何使用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>
标签。
感谢。
答案 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>