xslt - XSL 中每组值的最大总和

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

但我觉得有比在模板中使用排序更好的方法来实现此结果。有没有人要?

最佳答案

我。一个好的 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>上述代码在变量主体中的指令。

二。一种更好的 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))

关于xslt - XSL 中每组值的最大总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3383641/

相关文章:

xml - 将字符串解析转换为 XQuery 和 XPath

sql - 如何将xml的嵌套层次结构转换为sql表

xslt - 我可以使用 XSLT 忽略 namespace ,然后在同一个样式表中执行更多转换吗?

java - fo :data-cell overflow

c# - 通过 Saxon 在 XSLT 中调用 C# 函数

php - 检查循环中是否存在 XML 元素

xml - 我如何让 Nokogiri 了解我的 namespace ?

xslt - 如何使用 XSLT 按顺序解析嵌套标签?

xml - 引用 XML 数据库文件

SQL SELECT ... IN(xQuery)