围绕xsl:apply-templates的条件测试

时间:2012-06-13 21:19:21

标签: xslt xslt-1.0

我一直在努力学习如何在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?

4 个答案:

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