是著名的XSLT 1.0身份模板
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
与...同义
<xsl:template match="/|@*|*|processing-instruction()|comment()|text()">
<xsl:copy>
<xsl:apply-templates select="@*|*|processing-instruction()|comment()|text()"/>
</xsl:copy>
</xsl:template>
也就是说,node()在match语句中包含/在select语句中不包含/是否正确?
最佳答案
node()
节点测试没有不同的行为,具体取决于它是在match
还是select
属性中。身份模板的扩展版本如下:
<xsl:template match="@*|*|processing-instruction()|comment()|text()">
<xsl:copy>
<xsl:apply-templates select="@*|*|processing-instruction()|comment()|text()"/>
</xsl:copy>
</xsl:template>
node()
节点测试与任何节点匹配,但是当未为它指定显式轴时,默认情况下它位于child::
轴上。因此,模式match="node()"
与文档的根或属性不匹配,因为它们不在任何节点的子轴上。您可以观察到身份模板与根节点不匹配,因为它没有输出:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:if test="count(. | /) = 1">
<xsl:text>Root Matched!</xsl:text>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
并输出“ Root Match!”:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" indent="yes"/>
<xsl:template match="@* | node() | /">
<xsl:if test="count(. | /) = 1">
<xsl:text>Root Matched!</xsl:text>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
您可以在具有以下属性的任何文档上运行
node()
测试,以验证node()
测试是否适用于根节点和属性:<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" indent="yes"/>
<xsl:template match="node()">
<xsl:apply-templates select="@* | node()" />
</xsl:template>
<xsl:template match="/">
<xsl:if test="self::node()">
node() matches the root!
</xsl:if>
<xsl:apply-templates select="@* | node()" />
</xsl:template>
<xsl:template match="@*">
<xsl:if test="self::node()">
node() matches an attribute!
</xsl:if>
</xsl:template>
</xsl:stylesheet>
这是观察
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" indent="yes"/>
<xsl:template match="/*">
<xsl:value-of select="concat('The root element has ', count(ancestor::node()),
' ancestor node, which is the root node.')"/>
</xsl:template>
</xsl:stylesheet>
关于xslt - 什么是node()的显式版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16155940/