XSL计数带参数的节点数

时间:2014-12-18 09:59:24

标签: xml xslt

我有以下xml:

 <pax>
     <age>5</age>
 </pax>
  <pax>
     <age>5</age>
 </pax>
  <pax>
     <age>12</age>
 </pax>

接下来的xslt:

 <xsl:for-each select="paxes/pax">
                <xsl:variable name="PaxAge" select="age"/>
                <COUNT>
                  <xsl:value-of select='count(paxes/pax/age[text()=$PaxAge])'/>
                </COUNT>
   </xsl:for-each>

然而,我得到的结果总是

<COUNT>0</COUNT>
<COUNT>0</COUNT>
<COUNT>0</COUNT>

如果我将其更改为

<xsl:value-of select='count(paxes/pax/age[text()="5"])'/>

我会收到

<COUNT>2</COUNT>
<COUNT>2</COUNT>
<COUNT>2</COUNT>

输出应为:

<COUNT>2</COUNT>
<COUNT>1</COUNT>

如何获得每次迭代的写入次数?

2 个答案:

答案 0 :(得分:2)

假设您正在尝试计算出现的情况,

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:key name="age" match="/paxes/pax/age" use="." />

<xsl:template match="/">
  <xsl:for-each select="paxes/pax/age[generate-id(.) = generate-id(key('age', .)[1])]">
    <COUNT>

      <!-- optional -->
      <xsl:attribute name="age">
        <xsl:value-of select="."/>
      </xsl:attribute>

      <xsl:value-of select="count(key('age',.))"/>
    </COUNT>
  </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

应该给出一个xml:

<COUNT age="5">2</COUNT>
<COUNT age="12">1</COUNT>

答案 1 :(得分:2)

你说你想在输出中为每个不同的年龄值想要一个COUNT个元素。这使它成为一个分组查询。因此,在XSLT 2.0中,您可以使用分组查询:

<xsl:for-each-group select="paxes/pax/age" group-by=".">
  <COUNT><xsl:value-of select="count(current-group())"/></COUNT>
</xsl:for-each-group>

如果您仍然坚持使用XSLT 1.0,分组查询会非常棘手,但您可以使用Muenchian分组技术和密钥,如@Rnet的答案所示。