我有两个多发生结构<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
等于 TRUE
的first
元素的键,然后循环访问与键匹配的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>