该样式也将工作:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" />
<!--Identity template to copy content forward-->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<!--specialized template for elements with an "n" attribute-->
<xsl:template match="*[@n]">
<xsl:element name="{@n}">
<xsl:apply-templates select="node()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
在identity template第一模板,该模板上匹配@*
(这意味着任何属性)和node()
(这意味着任何元素,文本节点,处理指令或注释)。默认行为是复制匹配的项目,然后apply-templates
到它的任何属性或子节点。
如果在样式表中没有声明其他模板,那么该标识模板将匹配所有内容,并且XSLT将简单地复制XML文档。
第二个模板匹配*[@n]
,它是任何具有“n”属性的元素。 *
是任何元素的通配符匹配。方括号是谓词过滤器,其行为类似于SQL WHERE子句。谓词中指定的任何条件都必须为真,以便模板匹配选择适合的任何条件。谓词过滤器根据匹配项目的上下文进行评估,因此假设您“站立”在一个元素上,它是否具有@n
?如果是这样,那么这个模板匹配。
第二个模板比第一个“标识”模板具有更具体的匹配标准,所以它会“胜出”并匹配具有@n
的元素。
用于第二模板的逻辑是创建具有@n
的值的名称和元素那么对于任意子node()
的apply-templates
(它包括text()
和元素,但不包括属性)。
是的。是的你可以。 – amphetamachine 2010-09-19 10:20:14
可以请你发帖的方法 – new 2010-09-19 10:21:40