Суммирование кол-во с использованием XSLT 2.0 с группировкой - PullRequest
1 голос
/ 12 ноября 2009

Я пытаюсь суммировать поле qty в моем xml с помощью xslt 2.0, и оно выводит количество одного из моих единиц оборудования с несколькими записями без суммирования по группе оборудования. Любые идеи о том, как это можно исправить?

Это XSLT, который я использую:

<xsl:for-each-group select="//node()" group-by="*[local-name()='lin_id']/text()">
    <Results>
        <xsl:element name="LIN_ID"><xsl:value-of select="*[local-name()='lin_id']"/></xsl:element>
        <xsl:element name="Count"><xsl:value-of select="sum(current-group()/*[local-name()='qty'])"/></xsl:element>
    </Results>
</xsl:for-each-group>

Вот исходный XML-файл:

  <Equipment>
    <lin_id>C18312</lin_id>
    <qty>5</qty>
  </Equipment>
  <Equipment>
    <lin_id>C18345</lin_id>
    <qty>22</qty>
  </Equipment>
  <Equipment>
    <lin_id>C18378</lin_id>
    <qty>43</qty>
  </Equipment>
  <Equipment>
    <lin_id>C18378</lin_id>
    <qty>208</qty>
  </Equipment>

А вот что вывод на данный момент:

<Results>
        <LIN_ID>C18312</LIN_Name>
        <Count>5</Count>
    </Results>
    <Results>
        <LIN_ID>C18345</LIN_Name>
        <Count>22</Count>
    </Results>
        <Results>
        <LIN_ID>C18378</LIN_Name>
        <Count>43</Count>
    </Results>

Итак, вы можете видеть, что он выполняет группировку, но для LIN_ID C18378 он должен суммировать количество из 2 записей и выводить счет 251, но вместо этого он просто отображает одно из значений.

Ответы [ 2 ]

1 голос
/ 13 ноября 2009

Это преобразование :

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
>
    <xsl:output omit-xml-declaration="yes" indent="yes"/>

    <xsl:template match="/*">
      <top>
          <xsl:for-each-group select="Equipment/lin_id" group-by=".">
            <Results>
              <LIN_ID>
                <xsl:sequence select="current-grouping-key()"/>
              </LIN_ID>
              <Count>
                <xsl:sequence select="sum(current-group()/../qty/xs:integer(.))"/>
              </Count>
            </Results>
          </xsl:for-each-group>
      </top>
    </xsl:template>
</xsl:stylesheet>

применительно к предоставленному вводу (исправлено, чтобы быть правильно сформированным XML-файлом):

<t>
    <Equipment>
        <lin_id>C18312</lin_id>
        <qty>5</qty>
    </Equipment>
    <Equipment>
        <lin_id>C18345</lin_id>
        <qty>22</qty>
    </Equipment>
    <Equipment>
        <lin_id>C18378</lin_id>
        <qty>43</qty>
    </Equipment>
    <Equipment>
        <lin_id>C18378</lin_id>
        <qty>208</qty>
    </Equipment>
</t>

дает желаемый результат :

<top>
   <Results>
      <LIN_ID>C18312</LIN_ID>
      <Count>5</Count>
   </Results>
   <Results>
      <LIN_ID>C18345</LIN_ID>
      <Count>22</Count>
   </Results>
   <Results>
      <LIN_ID>C18378</LIN_ID>
      <Count>251</Count>
   </Results>
</top>
1 голос
/ 12 ноября 2009

Прежде всего - что должен делать <xsl:for-each-group select="//node()" >? Попробуйте:

<xsl:for-each-group select="//Equipment" group-by="lin_id">
  <Results>
    <LIN_ID>
      <xsl:value-of select="current-grouping-key()"/>
    </LIN_ID>
    <Count>
      <xsl:value-of select="sum(current-group()/qty)"/>
    </Count>
  </Results>
</xsl:for-each-group>

Если весь этот бизнес *[local-name()='…'] связан с пространствами имен, я предлагаю вам прямо сформулировать объявления пространств имен. Потому что это ненужно и граничит с ужасом. ; -)

Также: нет необходимости писать <xsl:element name="LIN_ID">, вы можете просто написать <LIN_ID> напрямую, как показано выше.

В целях отладки вы можете сделать:

<Count qty_nodes="{count(current-group()/qty)}">
  <xsl:value-of select="sum(current-group()/qty)"/>
</Count>

чтобы увидеть, сколько узлов current-group()/qty возвращает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...