输出中没有属性值

时间:2015-02-02 21:12:13

标签: xml xslt

我正在尝试制作打印所有属性值的模板。

<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

1 个答案:

答案 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>

请注意,不需要匹配@*的模板,因为内置模板规则现在适用于该模板,并在匹配时输出值。