我正在尝试制作打印所有属性值的模板。
<xsl:template match="@*">
<xsl:value-of select="."/>
</xsl:template>
<!-- override default template for text nodes -->
<xsl:template match="text()">
</xsl:template>
但是输出是空的。为什么呢?
输入
<hello name="Dominik">
<help level="Hard"/>
</hello>
预期输出
DominikHard
实际输出
EMPTY
答案 0 :(得分:2)
假设您只有这两个模板,而没有其他任何东西,您没有得到正确输出的原因是XSLT's built-in template rules,这适用于您的XSLT中没有匹配模板的情况。在您的情况下,您没有匹配任何元素的模板,因此应用以下内置模板
<xsl:template match="*|/">
<xsl:apply-templates/>
</xsl:template>
跳过元素并处理子节点。它不会选择任何属性,因此您的属性匹配模板不适用。
解决方案是将匹配text()
的模板更改为匹配node()
,并包含代码以选择其中的子属性。 (文本节点显然没有属性或子节点,因此该模板也将忽略文本节点)
尝试使用此XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text" indent="yes" />
<xsl:template match="node()">
<xsl:apply-templates select="@*|node()"/>
</xsl:template>
</xsl:stylesheet>
请注意,不需要匹配@*
的模板,因为内置模板规则现在适用于该模板,并在匹配时输出值。