我正在尝试实现一个文本过滤器,为每个文本节点添加一个父节点。
<xsl:template match="text()">
<aNewTag><xsl:value-of select="."/></aNewTag>
</xsl:template>
这可以正常工作,直到我通过以下方式间接调用它:
<xsl:apply-templates/>
但如果我直接使用
调用模板<xsl:apply-templates select="text()"/>
新标签消失。
任何人都可以解释我为什么吗?
干杯
扬
答案 0 :(得分:1)
我对自己的代码感到有点困惑。完整的示例如下所示:
<xsl:template match="/">
<xsl:call-template name="a">
<xsl:with-param name="b">
<xsl:apply-templates select="text()"/>
</xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template name="a">
<xsl:param name="b"/>
<xsl:value-of select="$b"/> <!-- here is my error -->
</xsl:template>
<xsl:template match="text()">
<aNewTag>
<xsl:value-of select="."/>
</aNewTag>
</xsl:template>
我的错误是,我没有在调用模板中看到value-of
。如果我将value-of
更改为apply-templates
,一切正常。
感谢
扬
答案 1 :(得分:0)
如果使用不带select属性的xal:apply-templates元素,则select的值隐式设置为node(),即所有子节点,因此text()模板匹配。
答案 2 :(得分:0)
我认为问题在于模板“a”中参数“b”是一个节点集。要访问它,您可能必须在XSL中使用“节点集”扩展功能。它不是标准XSLT的一部分,因此您需要指定扩展名。
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ext="urn:schemas-microsoft-com:xslt">
<xsl:template match="/">
<xsl:call-template name="a">
<xsl:with-param name="b">
<xsl:apply-templates select="text()"/>
</xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template name="a">
<xsl:param name="b"/>
<xsl:for-each select="ext:node-set($b)">
<xsl:copy-of select="."/>
</xsl:for-each>
</xsl:template>
<xsl:template match="text()">
<aNewTag>
<xsl:value-of select="."/>
</aNewTag>
</xsl:template>
</xsl:stylesheet>
这个仅适用于Microsoft的XML解析器(MSXML)。对于其他XML处理器,例如xsltproc,应使用名称空间“http://exslt.org/common”。
然后,这允许您访问构成“b”参数的节点或节点,尽管在上面的示例中我已经习惯了迭代它们。
这是一篇解释节点集
的文章