请建议这些XSLT函数之间的主要区别,其中以下输入和XSLT代码的这三个函数的结果相同(删除注释和执行)。建议使用这些功能的特殊重要性。这些功能在名称空间区域中是否不同。 (XSLT2)
输入xml:
<root>
<a>The text a1
<b>The text b1</b>
<b>The text b2
<c>The text c1</c>
</b>
<c>The text c2</c>
</a>
</root>
XSLT:
<xsl:stylesheet version="2.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="b">
<xsl:element name="B"><xsl:next-match/></xsl:element>
</xsl:template-->
<!--xsl:template match="b">
<xsl:element name="B"><xsl:copy-of select="."/></xsl:element>
</xsl:template-->
<xsl:template match="b">
<xsl:element name="B">
<xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:1)
您目前无法看到您的方法之间的差异,因为您的示例仍然过于简单。让我们先描述<xsl:copy-of>
和<apply-templates>
之间的区别:<xsl:copy>
制作上下文节点.
的文字副本例如:
<b>The text b2
<c>The text c1</c>
</b>
在文字副本中,如果子标记<c>
存在任何匹配规则,则XSLT处理器不再检查。他们完全被忽略了。
但是,代码<xsl:apply-templates>
会将所有可用的模板规则应用于任何给定的深度,因此如果您有<c>
的规则,则会应用该规则。
因此:要查看前两个选项之间的差异,请为<c>
创建模板匹配,不为其制作文字副本。
了解<xslt:next-match>
的使用稍微困难一些。它要求您知道下一个最佳模板匹配将在您调用它的位置。在您的情况下,因为您只有默认的复制规则
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
在<b>
的特定规则旁边,默认规则是下一个最佳。当然,默认规则除了使用<apply-templates>
再次复制子树之外别无其他,因此您没有看到任何差异。
为了查看其中的差异,规则需要为<b>
创建一个规则,该规则不如现有具体但同时更多具体表示默认规则。这可能很难做到。