2017-01-11 12 views
1

У меня есть две структуры с несколькими событиями <first> и <second>. Они имеют одинаковое число (это означает, например, 3 элемента <first> и 3 элемента <second>). Мне нужно, чтобы создать одну сумму, но со следующими условиями:
sum(if(first/code=second/code and first/boolean='TRUE')then val1*val2))(XSLT), как суммировать элементы из структуры множественного возникновения, с условием из различной структуры с несколькими событиями

Входной 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?

+1

Пожалуйста, укажите при использовании XSLT 1.0 или 2.0. –

+0

В моем случае: XSLT 1.0 – user3117171

+0

Пожалуйста, добавьте тег XSLT 1.0, а не XSLT. –

ответ

1

Если вы можете использовать XSLT 2.0, вы можете создать ключ first элементов, которые имеют booleanV равную TRUE и затем цикл над second элементов, которые соответствуют ключ ...

XML Input

<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> 
2

В 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> 

 Смежные вопросы

  • Нет связанных вопросов^_^