XSLT рекурсивно добавляет числа и использует их в условной проверке - PullRequest
1 голос
/ 09 декабря 2011

Я столкнулся с проблемой при добавлении значений в конкретном узле и использовании этого в условной проверке. Мой ввод XML:

 <record>
        <item name="measure">Measure1</item>
        <item name="amount">100</item>
    </record>
    <record>
        <item name="measure">Measure2</item>
        <item name="amount">200</item>
    </record>
    <record>
        <item name="measure">Measure3</item>
        <item name="amount">300</item>
    </record>
Using xslt, I have to create an output which will look like:


<result>
        <entry name="Measure1">100</entry>
        <entry name="Measure2">200</entry>
        <entry name="Measure3">300</entry>
        //requirement starts here
        if sum of measure1 i.e 100 + measure2 i.e 200 + measure3 i.e 300 >=0
        <entry name="Measure4">m1 + m2 + m3</entry> 
        otherwise if sum of measure1 + measure2 + measure3 < 0, the element should be
        <entry name="measure5"> m1 + m2+ m3 </entry>
    </result>

Я пробовал рекурсивный вызов шаблона для добавления чисел, но не знаю, как получить выходные данные в переменной и использовать это в условной проверке. Например, в приведенном выше случае я хочу добавить 100, 200 и 300 и проверить, если 600> = 0. Это правда и, следовательно, в выходной XML, я хочу только отображать measure4. Если сумма была <0, я хочу отображать меру5, а не меру4. Пожалуйста, помогите мне, гуру. </p>

Ответы [ 2 ]

0 голосов
/ 09 декабря 2011

Это короткое и простое преобразование (без xsl:choose, xsl:when и xsl:otherwise):

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:variable name="vSum" select="sum(/*/*/item[2])"/>
 <xsl:variable name="vNewNum"
 select="count(/*/record) + 2 - ($vSum >= 0)"/>

 <xsl:template match="/*">
  <xsl:apply-templates/>
  <xsl:apply-templates select="*[1]" mode="cond"/>
 </xsl:template>

 <xsl:template match="record">
  <entry name="{item[1]}">
   <xsl:value-of select="item[2]"/>
  </entry>
 </xsl:template>

 <xsl:template mode="cond" match="record">
  <entry name="Measure{$vNewNum}">
   <xsl:value-of select="$vSum"/>
  </entry>
 </xsl:template>
</xsl:stylesheet>

при применении к следующему документу XML (предоставленный фрагмент обернут в верхний элемент, чтобы сделать его правильно сформированным документом XML, а последнее число увеличилось на 1):

<t>
    <record>
        <item name="measure">Measure1</item>
        <item name="amount">100</item>
    </record>
    <record>
        <item name="measure">Measure2</item>
        <item name="amount">200</item>
    </record>
    <record>
        <item name="measure">Measure3</item>
        <item name="amount">301</item>
    </record>
</t>

дает желаемый, правильный результат :

<entry name="Measure1">100</entry>
<entry name="Measure2">200</entry>
<entry name="Measure3">301</entry>
<entry name="Measure4">601</entry>

когда в приведенном выше XML мы меняем последнее число на отрицательное, так что вся сумма теперь равна -1:

<t>
    <record>
        <item name="measure">Measure1</item>
        <item name="amount">100</item>
    </record>
    <record>
        <item name="measure">Measure2</item>
        <item name="amount">200</item>
    </record>
    <record>
        <item name="measure">Measure3</item>
        <item name="amount">-301</item>
    </record>
</t>

результат теперь снова правильный и требуемый :

<entry name="Measure1">100</entry>
<entry name="Measure2">200</entry>
<entry name="Measure3">-301</entry>
<entry name="Measure5">-1</entry>
0 голосов
/ 09 декабря 2011
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/root">
    <result>
      <xsl:apply-templates select="record"/>

      <xsl:variable name="sum" select="sum(record/item[@name = 'amount'])"/>

      <xsl:variable name="n">
        <xsl:choose>
          <xsl:when test="$sum >= 0">
            <xsl:text>Measure4</xsl:text>
          </xsl:when>
          <xsl:otherwise>
            <xsl:text>measure5</xsl:text>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:variable>

      <entry name="{$n}">
        <xsl:value-of select="$sum"/>
      </entry>
    </result>
  </xsl:template>

  <xsl:template match="record">
    <entry name="{item[@name = 'measure']}">
      <xsl:value-of select="item[@name = 'amount']"/>
    </entry>
  </xsl:template>

</xsl:stylesheet>

Входной XML:

<root>
  <record>
    <item name="measure">Measure1</item>
    <item name="amount">100</item>
  </record>
  <record>
    <item name="measure">Measure2</item>
    <item name="amount">200</item>
  </record>
  <record>
    <item name="measure">Measure3</item>
    <item name="amount">300</item>
  </record>
</root>

Выход:

<result>
  <entry name="Measure1">100</entry>
  <entry name="Measure2">200</entry>
  <entry name="Measure3">300</entry>
  <entry name="Measure4">600</entry>
</result>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...