XSL中每组最高值

时间:2010-08-01 20:33:01

标签: xslt xpath xquery

对于这个问题,可能有一个非常简单的解决方案。我可以在C#-LINQ中轻松完成。不幸的是,我对XPath和XSL并不熟悉。

我有一个包含以下结构的输入XML文件:

<group>
    <val>1</val>
    <val>3</val>
    <val>1</val>
</group>
<group>
    <val>3</val>
    <val>2</val>
    <val>2</val>
</group>

现在在我的XSL转换中,我想定义1个变量“highestsum”,它包含“值”的最高总和。因此,对于该示例,它将返回7,即第二组中所有值的总和。

经过一番搜索,这是我找到的最接近的解决方案:

http://w3schools.invisionzone.com/index.php?showtopic=24265

但我觉得有一种比在模板中使用排序更好的方法来实现这个结果。任何人?

1 个答案:

答案 0 :(得分:3)

<强>予。一个好的XSLT 1.0解决方案(简短,高效且易于理解):

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

 <xsl:template match="/*">
   <xsl:for-each select="group">
     <xsl:sort select="sum(val)" data-type="number"
      order="descending"/>

     <xsl:if test="position()=1">
       <xsl:value-of select="sum(val)"/>
     </xsl:if>
   </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

将此转换应用于以下XML文档

<t>
    <group>
        <val>1</val>
        <val>3</val>
        <val>1</val>
    </group>
    <group>
        <val>3</val>
        <val>2</val>
        <val>2</val>
    </group>
</t>

产生了想要的正确结果

7

要获得所需的变量定义,只需将上述代码中的<xsl:for-each>指令放在变量的正文中即可。

<强> II。一个更好的XSLT 2.0(实际上是XPath 2.0单线程)解决方案:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/*">
   <xsl:sequence select="max(group/sum(val))"/>
 </xsl:template>
</xsl:stylesheet>

将此转换应用于同一XML文档时,会生成相同的正确答案

7

想要的变量定义只是

  <xsl:variable name="vHighestSum" 
       select="max(group/sum(val))"/>

最后,可以在XQuery中使用相同的Xpath表达式来定义所需的变量:

let $vHighestSum := max(/*/group/sum(val))