1

これは私のxmlコードの例です:

<db>
  <group>
  <name>Team1</name>
    <set num="1">AAA</set>
    <set num="2">BBB</set>
    <set num="3">CCC</set>
  </group>
  <group>
  <name>Team2</name>
    <set num="1">DDD</set>
    <set num="2">AAA</set>
    <set num="3">FFF</set>
    <set num="4">EEE</set>
  </group>
  <group>
  <name>Team3</name>
    <set num="1">AAA</set>
    <set num="2">GGG</set>
    <set num="3">FFF</set>
  </group>
  <group>
  <name>Team4</name>
    <set num="1">BBB</set>
    <set num="2">EEE</set>
    <set num="3">AAA</set>
  </group>
</db>

xslt を使用して、AAA の num が 3 未満のすべてのインスタンスの名前と num を表示するにはどうすればよいので、出力は次のようになります。

<result value="AAA">
  <name num="1">Team1</name>
  <name num="2">Team2</name>
  <name num="1">Team3</name>
</result>

私が使用しようとしているコードは次のとおりです。

...
<xsl:template match="/db">
  <result value="AAA">
    <xsl:for-each select="group[set/@num &lt; '3' and set='AAA']">
      <name num="{@num}">
        <xsl:value-of select="name" />
      </name>
    </xsl:for-each>
  </result>
</xsl:template>

しかし、これにより、数値に関係なく「AAA」を含むすべてのグループが得られ、数値は常に「」と表示されます。

私は XSLT を初めて使用するので、助けていただければ幸いです。ありがとう!

4

1 に答える 1

1

これはそれを行う必要があります:

  <xsl:template match="/db">
    <result value="AAA">
      <xsl:for-each select="group[set[@num &lt; 3 and string(.)='AAA']]">
        <name num="{set[@num &lt; 3 and string(.)='AAA']/@num}">
          <xsl:value-of select="name" />
        </name>
      </xsl:for-each>
    </result>
  </xsl:template>

問題は、 と を別々にテストset/@num &lt; '3' and set='AAA'することですが、必要なのは両方の条件に同時に一致する要素です。これは、ネストされた制限= 3 未満で を含むサブ要素を持つすべてのグループで行われます。@numsetset[set[@num &lt; 3 and string(.)='AAA']]set@numAAA

@num正しいsetサブ要素からの値を取得するために、同じテストが繰り返されます。

テストの繰り返しを避けるための代替手段:

  <xsl:template match="/db">
    <result value="AAA">
      <xsl:for-each select="group">
        <xsl:variable name="theSet" select="set[@num &lt; 3 and string(.)='AAA']"/>
        <xsl:if test="$theSet">
          <name num="{$theSet/@num}">
            <xsl:value-of select="name" />
          </name>
        </xsl:if>
      </xsl:for-each>
    </result>
  </xsl:template>
于 2013-05-06T21:01:46.933 に答える