输出中没有属性值
No atributes value in output
我正在尝试制作打印所有属性值的模板。
<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
假设您只有这两个模板,没有别的,您没有得到正确输出的原因是 XSLT's built-in template rules,当您的 XSLT 中没有匹配的模板时适用。在您的情况下,您没有匹配任何元素的模板,因此应用以下内置模板
<xsl:template match="*|/">
<xsl:apply-templates/>
</xsl:template>
这将跳过元素并处理子节点。但是它 select 没有任何属性,因此您的属性匹配模板不适用。
解决方案是将匹配 text()
的模板更改为匹配 node()
,并将代码包含到 select 的子属性中。 (文本节点显然没有属性或子节点,所以这个模板也会忽略文本节点)
试试这个 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>
请注意如何不需要模板匹配 @*
因为内置模板规则现在适用于此,并且在匹配时输出值。
我正在尝试制作打印所有属性值的模板。
<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
假设您只有这两个模板,没有别的,您没有得到正确输出的原因是 XSLT's built-in template rules,当您的 XSLT 中没有匹配的模板时适用。在您的情况下,您没有匹配任何元素的模板,因此应用以下内置模板
<xsl:template match="*|/">
<xsl:apply-templates/>
</xsl:template>
这将跳过元素并处理子节点。但是它 select 没有任何属性,因此您的属性匹配模板不适用。
解决方案是将匹配 text()
的模板更改为匹配 node()
,并将代码包含到 select 的子属性中。 (文本节点显然没有属性或子节点,所以这个模板也会忽略文本节点)
试试这个 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>
请注意如何不需要模板匹配 @*
因为内置模板规则现在适用于此,并且在匹配时输出值。