select元素中的XSL count()

时间:2017-04-21 12:39:38

标签: xml xslt xpath

我有一种记分牌,想要计算胜利的球队。但不幸的是我无法计算id值的出现次数。这是示例xml文档:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="winner.xsl" ?>
<wm>
    <game>
        <team id='de' />
        <team id='fr' />
        <result>4:2</result>
    </game>
    <game>
        <team id='us' />
        <team id='de' />
        <result>4:2</result>
    </game>
    <game>
        <team id='de' />
        <team id='fr' />
        <result>3:2</result>
    </game>
    <game>
        <team id='de' />
        <team id='fr' />
        <result>1:3</result>
    </game>
</wm>

和xsl:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:template match="wm/game/result">
<xsl:variable name="tore1" select="substring-before(.,':')"/>
<xsl:variable name="tore2" select="substring-after(.,':')"/>

 <xsl:choose>
     <xsl:when test="$tore1 &gt; $tore2">
         <xsl:value-of select="../team[1]/@id"/><br />
     </xsl:when>
     <xsl:otherwise>
         <xsl:value-of select="../team[2]/@id"/><br />
     </xsl:otherwise>
 </xsl:choose>

我通过比较结果的目标并选择团队[1]或团队[2]来设置游戏的赢家。输出是:

de
us
de
fr

但现在我仍然坚持计算这些国家的外观。如果我在XPath表达式上设置count(),如

<xsl:value-of select="count(../team[1]/@id)" />

导致:

1
1
1
1

另外

<xsl:value-of select="count(../team[@id = 'de'])"/>
在select语句之外的

执行相同的输出。我想有以下输出

2 de
1 us
1 fr

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

计算已知团队的获胜次数非常简单。请考虑以下示例:

<xsl:template match="/wm">
    <xsl:variable name="id" select="'de'"/>
    <xsl:variable name="home-wins" select="count(game[team[1]/@id=$id][substring-before(result, ':') > substring-after(result, ':')])"/>
    <xsl:variable name="away-wins" select="count(game[team[2]/@id=$id][substring-after(result, ':') > substring-before(result, ':')])"/>
    <xsl:value-of select="$home-wins + $away-wins"/>
    <xsl:text> </xsl:text>  
    <xsl:value-of select="$id"/>
</xsl:template>

<强>结果

2 de

答案 1 :(得分:0)

感谢。 @ michael.hor257k的答案很好。我也尝试应用Meunchian分组。我想我明白了。谢谢你的帮助。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">


<xsl:key name="teamsByID" match="game/team" use="@id"/>

<xsl:template match="wm">

  <xsl:for-each select="game/team[count(. | key('teamsByID', @id)[1]) = 1]">
    <xsl:variable name="id" select="@id"/>
    <xsl:variable name="tore1" select="count(../../game[team[1]/@id=$id][substring-before(result,':') > substring-after(result, ':')])" />
    <xsl:variable name="tore2" select="count(../../game[team[2]/@id=$id][substring-after(result,':') > substring-before(result, ':')])" />
    <xsl:value-of select="$tore1 + $tore2"/>  -  <xsl:value-of select="@id"/><br />
  </xsl:for-each>   

</xsl:template>