【问题标题】:Use XSLT to find node and specific attribute value使用 XSLT 查找节点和特定属性值
【发布时间】:2013-05-06 20:42:53
【问题描述】:

这是我的 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 的新手,我将不胜感激。 谢谢!

【问题讨论】:

    标签: xslt xpath


    【解决方案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 &amp;lt; '3' and set='AAA' 分别测试@numset,而需要的是同时匹配这两个条件的set 元素——这是通过嵌套限制[set[@num &amp;lt; 3 and string(.)='AAA']] =所有具有@num 小于3 且包含AAAset 子元素的组。

    重复相同的测试以从正确的set 子元素中获取@num 的值。

    避免重复测试的替代方法:

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

    【讨论】:

    • 效果很好!非常感谢。我知道这是问题所在,但找不到如何同时匹配这两个条件。我搜索了一段时间,从未见过“string(.)”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多