5

私は 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

国がUSAの値を持ち、年の値が1985の場合にのみ年を削除したいのですが、国の値がUSAのみの場合は常に年を削除しています。apply-templates を使用するより良い方法はありますか?

4

4 に答える 4

5

条件付きの「if」チェックを行わずに、必要なノード セットにテンプレートを直接適用することをお勧めします。

<xsl:apply-templates select="year[not(../country='USA' and ../year='1985)]" />
于 2012-06-13T21:34:41.017 に答える
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式を指定することができます。

于 2012-06-14T02:32:22.523 に答える
-1

国が USA で、年が 1985 の場合、年を削除します。

したがって、国が USA でない場合、または年が 1985 でない場合は、年をコピーします。

条件は のor代わりに を使用する必要がありandます。注意してくださいnot(a and b) = (not a) or (not b)

于 2012-06-13T21:25:16.353 に答える