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”的组,而不管 num 是多少,无论如何 num 总是显示为“”。

任何帮助将不胜感激,因为我是 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'分别测试@numand set,而需要的是一个set同时匹配两个条件的元素 - 这是通过嵌套限制完成的[set[@num &lt; 3 and string(.)='AAA']]= 所有具有小于 3 和包含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 回答