(XSLT) 如何对来自多出现结构的元素求和,以及来自不同多出现结构的条件

  • 本文关键字:结构 条件 求和 元素 XSLT xml xslt xslt-1.0
  • 更新时间 :
  • 英文 :


我有两个多发生结构<first><second>。它们具有相同的数字。(它的意思是例如 3 个元素<first>和 3 个元素<second>)。我需要创建一个总和,但有以下条件:
sum(if( first/code=second/code and first/boolean='TRUE')then val1*val2))

输入 XML:

<test>
    <first>
        <code>1</code>
        <booleanV>TRUE</booleanV>
    </first>
    <first>
        <code>2</code>
        <booleanV>FALSE</booleanV>
    </first>
    <first>
        <code>3</code>
        <booleanV>TRUE</booleanV>
    </first>
    <second>
        <code>1</code>
        <val1>2</val1>
        <val2>3</val2>
    </second>
    <second>
        <code>2</code>
        <val1>4</val1>
        <val2>5</val2>
    </second>
    <second>
        <code>3</code>
        <val1>6</val1>
        <val2>7</val2>
    </second>
</test>

就我而言,结果将是:
sum(2*3+6*7).

任何人都可以帮助我如何使用 XSLT 完成上述要求吗?

在 XSLT 1.0 中,您需要分两步执行此操作:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:key name="first" match="first" use="code"/>
<xsl:template match="/test">
    <!-- first-pass -->
    <xsl:variable name="products">
        <xsl:for-each select="second[key('first', code)/booleanV = 'TRUE']">
            <product>
                <xsl:value-of select="val1 * val2"/>
            </product>
        </xsl:for-each>
    </xsl:variable>
    <!-- output -->
    <result>
        <xsl:value-of select="sum(exsl:node-set($products)/product)"/>
    </result>
</xsl:template>
</xsl:stylesheet>

如果您能够使用 XSLT 2.0,则可以创建booleanV等于 TRUEfirst元素的键,然后循环访问与键匹配的second元素...

XML 输入

<test>
    <first>
        <code>1</code>
        <booleanV>TRUE</booleanV>
    </first>
    <first>
        <code>2</code>
        <booleanV>FALSE</booleanV>
    </first>
    <first>
        <code>3</code>
        <booleanV>TRUE</booleanV>
    </first>
    <second>
        <code>1</code>
        <val1>2</val1>
        <val2>3</val2>
    </second>
    <second>
        <code>2</code>
        <val1>4</val1>
        <val2>5</val2>
    </second>
    <second>
        <code>3</code>
        <val1>6</val1>
        <val2>7</val2>
    </second>
</test>

XSLT 2.0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>
  <xsl:key name="firsts" match="first[booleanV='TRUE']" use="code"/>
  <xsl:template match="test">
    <results>
      <xsl:value-of select=
        "sum(
             for $x in second[key('firsts',code)] 
               return $x/val1 * $x/val2
             )"/>
    </results>
  </xsl:template>
</xsl:stylesheet>

输出

<results>48</results>

相关内容

  • 没有找到相关文章

最新更新