输出中没有属性值

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>

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