鉴于此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 > 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, ...
答案 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 > 20]">
<idKP> <xsl:value-of select="id"/></idKP>
<skitter><xsl:value-of select="name"/></skitter>
</xsl:template>
<xsl:template match="p"/>
</xsl:stylesheet>