xslt-v1: сумма значений элементов, определенных соседями - PullRequest
0 голосов
/ 05 ноября 2018

как я могу создать результирующую строку "Код" + "Sum_of_Value_for_adjacent_Items_with_equal_Code" -...? Другими словами, для xml ниже reslut должен быть A3-B7-A2-C13-A4. Можно ли добиться с xsl v1?

<?xml version="1.0" encoding="UTF-8"?>

<MyXML>
<Item id = "1">
     <Code>A</Code> 
     <Value>2</Value> 
</Item>
<Item id = "2">
     <Code>A</Code> 
     <Value>1</Value> 
</Item>
<Item id = "3">
     <Code>B</Code> 
     <Value>7</Value> 
</Item>
<Item id = "4">
     <Code>A</Code> 
     <Value>2</Value> 
</Item>
<Item id = "5">
     <Code>C</Code> 
     <Value>8</Value> 
</Item>
<Item id = "6">
     <Code>C</Code> 
     <Value>3</Value> 
</Item> 
<Item id = "7">
     <Code>C</Code> 
     <Value>2</Value> 
</Item>     
<Item id = "8">
     <Code>A</Code> 
     <Value>4</Value> 
</Item>     
</MyXML>

1 Ответ

0 голосов
/ 05 ноября 2018

Один подход XSLT 1 для этого - так называемая рекурсия брата, где вы обрабатываете первый Item, а затем рекурсивно следующий following-sibling::Item[1]:

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

  <xsl:output method="text"/>

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

  <xsl:template match="Item">
      <xsl:param name="sum" select="0"/>
      <xsl:variable name="next" select="following-sibling::Item[1]"/>
      <xsl:choose>
          <xsl:when test="$next/Code = Code">
              <xsl:apply-templates select="$next">
                  <xsl:with-param name="sum" select="$sum + Value"/>
              </xsl:apply-templates>
          </xsl:when>
          <xsl:otherwise>
              <xsl:value-of select="concat(Code, $sum + Value, '-')"/>
              <xsl:apply-templates select="$next"/>
          </xsl:otherwise>
      </xsl:choose>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty -development.net / bdxtr6

Здесь показан подход в целом, чтобы избежать трейлинга - после последнего значения, вам нужно вставить дополнительную проверку или сохранить результат в переменной и извлечь substring($var, 1, string-length($var) - 1).

...