XSL apply-templates输出问题

时间:2015-06-10 18:42:07

标签: xslt apply-templates

鉴于此XML:

<?xml version="1.0" encoding="iso-8859-2" ?>
    <products>
        <p>
            <id> 50 </id>
            <name> Murphy </name>
            <price> 33 </price>
        </p>
        <p>
            <id> 40 </id>
            <name> Eddie </name>
            <price> 9999 </price>
        </p>
        <p>
            <id> 20 </id>
            <name> Honey </name>
            <price> 9999 </price>
        </p>
        <p>
            <id> 30 </id>
            <name> Koney </name>
            <price> 11 </price>
        </p>
        <p>
            <id> 10 </id>
            <name> Margarethe </name>
            <price> 11 </price>
        </p>
    </products>

使用此XSL:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="p[id &gt; 20]">
    <idKP>   <xsl:value-of select="id"/></idKP>
    <skitter><xsl:value-of select="name"/></skitter>
</xsl:template>


<xsl:template match="/">
    <xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>

拥有此输出:

<?xml version="1.0"?>
<idKP>50</idKP><skitter>Murphy</skitter>
<idKP>40</idKP><skitter>Eddie</skitter>
20
Honey
9999
<idKP>30</idKP><skitter>Koney</skitter>
10
Margarethe
11
  

问:为什么有不匹配的人的价值观? 20, Honey, 9999, ...

2 个答案:

答案 0 :(得分:1)

由于built-in template rules - 当没有明确的模板匹配特定节点时,使用内置规则,对于元素节点意味着<xsl:apply-templates/>,对于文本节点意味着{{1 }}。这两个规则组合的效果是输出元素下的所有文本,但不输出元素标记本身。

您可以添加第二个无用模板

<xsl:value-of select="."/>

完全忽略与您的情况不符的<xsl:template match="p" /> 元素。与默认的内置规则相比,显式模板(即使是无用的模板)也是首选。

答案 1 :(得分:0)

要添加答案,这是解决方案:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="p[id &gt; 20]">
    <idKP>   <xsl:value-of select="id"/></idKP>
    <skitter><xsl:value-of select="name"/></skitter>
</xsl:template>

<xsl:template match="p"/>

</xsl:stylesheet>