我一直在努力学习如何在xslt中编码,目前我仍然坚持如何在xsl:apply-templates标签周围使用条件测试。
这是我正在测试的xml。
<?xml version="1.0" encoding="utf-8"?>
<catalog>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<year>1985</year>
</cd>
<cd>
<title>Hide your heart</title>
<artist>Bonnie Tyler</artist>
<country>UK</country>
<company>CBS Records</company>
<price>9.90</price>
<year>1988</year>
</cd>
<cd>
<title>Greatest Hits</title>
<artist>Dolly Parton</artist>
<country>USA</country>
<company>RCA</company>
<price>9.90</price>
<year>1982</year>
</cd>
这是我的xslt
<xsl:template match="/">
<xsl:apply-templates select="catalog/cd" />
</xsl:template>
<xsl:template match="cd">
<p>
<xsl:apply-templates select="artist" />
<br />
<xsl:apply-templates select="country" />
<br />
<xsl:if test="country != 'USA' and year != '1985'">
<xsl:apply-templates select="year" />
</xsl:if>
</p>
</xsl:template>
<xsl:template match="artist">
<xsl:value-of select="." />
</xsl:template>
<xsl:template match="country">
<xsl:value-of select="." />
</xsl:template>
<xsl:template match="year">
<xsl:value-of select="." />
</xsl:template>
这是我的输出:
Bob Dylan
USA
Bonnie Tyler
UK
1988
Dolly Parton
USA
这是我期待的输出:
Bob Dylan
USA
Bonnie Tyler
UK
1988
Dolly Parton
USA
1982
即使我想删除年份只有当国家/地区的价值为美国且年份的价值为1985年时,它才会删除年份,而每次国家/地区只有美国的价值。有没有更好的方法可以使用apply-templates?
答案 0 :(得分:4)
您可能更喜欢直接将模板应用于所需的节点集,而无需条件“if”检查。
<xsl:apply-templates select="year[not(../country='USA' and ../year='1985)]" />
答案 1 :(得分:1)
只需纠正您的逻辑。
<强>替换强>:
<xsl:if test="country != 'USA' and year != '1985'">
<强>与强>:
<xsl:if test="country != 'USA' or year != '1985'">
甚至更好,仅在所需节点上应用模板:
<xsl:apply-templates select=
"self::*[country != 'USA' or year != '1985']/year"/>
请注意:
如图所示,可以在select
属性中指定Xpath表达式,而无需使用任何反向轴(来回)。
答案 2 :(得分:1)
这对我有所帮助,谢谢。
我正在扩展这个例子并尝试为某个属性调用一个模板(我已经将XML编辑为例如<artist sex="male">Bob Dylan</artist>
我的尝试失败但我解决了。此代码允许我在&gt; 1场景中创建条件模板: -
<xsl:template match="cd">
<p>
<xsl:apply-templates select="title"/>
<xsl:apply-templates select="artist [@sex = 'male']"/>
<xsl:apply-templates select="artist [@sex = 'female']"/>
<xsl:apply-templates select="year"/>
</p>
</xsl:template>
<xsl:template match="title">
Title: <span style="color:#ff0000">
<xsl:value-of select="."/></span>
<br />
</xsl:template>
<xsl:template match="artist [@sex = 'male']">
Artist: <span style="color:#e9d419">
<xsl:value-of select="."/></span>
<br />
</xsl:template>
<xsl:template match="artist [@sex = 'female']">
Artist: <span style="color:#48b8ff">
<xsl:value-of select="."/></span>
<br />
</xsl:template>
<xsl:template match="year">
Year: <span style="color:#eb47dc">
<xsl:value-of select="."/></span>
<br />
</xsl:template>
希望这有帮助,对某人有用!根据他们的性别,输出产生了不同颜色的艺术家名称。
答案 3 :(得分:-1)
如果国家/地区是美国且年份是1985年,您想要删除年份。
因此,如果国家不是美国或,如果年份不是1985年,您希望复制年份。
您的情况应使用or
代替and
。请注意not(a and b) = (not a) or (not b)
。