Можно ли группировать и суммировать сегменты / узлы в XSLT? - PullRequest
2 голосов
/ 13 июня 2019

При получении заказов обратно, если строка заказа разделена на две коробки, компания возвращает XML с некоторым количеством в одной коробке, а некоторые - в другом для той же обуви.Это вызывает у нас проблемы, потому что когда мы отправляем его обратно в ERP, он отправляет, например, 4 строки, когда в заказе только 3 строки.

Я посмотрел эту статью о группировке, но получаютак потерян!По сути, все, что я хочу сделать, это сгруппировать его по статьям, чтобы я мог суммировать количество и сохранить его в одной строке.

Я пытался использовать этот учебник - https://www.codeproject.com/Articles/1849/Grouping-XML-using-XSLT-2

Все, что я хочунужно воспроизвести этот вывод, но с появлением статьи 261087750000 только один раз, с количеством 66, а не дважды с 48 и 18.

Я пробовал это в for-each, но ничего не возвращается -

<xsl:for-each select="//dispatch[generate-id(.) = generate- 
id(key('keyArticle', Carton/CartonDetails/ArticleNumber)[1])]">
<xsl:variable name="lngArticle"><xsl:value-of 
select="Carton/CartonDetails/ArticleNumber" />
</xsl:variable>
<xsl:variable name="lstCarton" 
select="//Carton[Carton/CartonDetails/ArticleNumber=$lngArticle]" />

Фактический XML здесь -

<?xml version="1.0" encoding="UTF-8"?>
<Dispatches>
 <dispatch>
 <orderNo>4703368395</orderNo>
 <CartonQty>84</CartonQty>
 <Carton>
  <DispDate>20190613</DispDate>
  <CartonDetails>
   <LineNumber>1</LineNumber>                                  
   <ArticleNumber>261087750000</ArticleNumber>
   <Quantity>48</Quantity>
  </CartonDetails>
  <CartonDetails>
   <LineNumber>2</LineNumber>
   <ArticleNumber>261135720000</ArticleNumber>
   <Quantity>12</Quantity>
  </CartonDetails>
 </Carton>
 <Carton>
  <BoxNo>0920000075</BoxNo>
  <DispDate>20190613</DispDate>
  <CartonDetails>
   <LineNumber>1</LineNumber>
   <ArticleNumber>261087750000</ArticleNumber>
   <Quantity>18</Quantity>
   </CartonDetails>
   <CartonDetails>
   <LineNumber>2</LineNumber>
   <ArticleNumber>261087840000</ArticleNumber>
   <Quantity>6</Quantity>
   </CartonDetails>
  </Carton>
</dispatch>

Ожидаемый результат будет -

<CartonDetails>
  <LineNumber>1</LineNumber>                                  
  <ArticleNumber>261087750000</ArticleNumber>
  <Quantity>66</Quantity>
</CartonDetails>

1 Ответ

1 голос
/ 13 июня 2019

Рассмотрите возможность работы с несколькими шаблонами, возвращающими CartonDetails с отличным ArticleNumber .Затем суммируйте Количество с клавиатуры.

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

  <xsl:key name="keyArticle" match="CartonDetails" use="ArticleNumber"/>

  <xsl:template match="/Dispatches">
      <Carton>
          <xsl:apply-templates select="dispatch/Carton"/>
      </Carton>
  </xsl:template>

  <xsl:template match="Carton">
      <xsl:apply-templates select="CartonDetails[generate-id() =
                         generate-id(key('keyArticle', ArticleNumber)[1])]"/>
  </xsl:template>

  <xsl:template match="CartonDetails">
      <xsl:copy>
          <xsl:copy-of select="LineNumber|ArticleNumber"/>
          <Quantity>
             <xsl:value-of select="sum(key('keyArticle', ArticleNumber)/Quantity)"/>
          </Quantity>
      </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

Онлайн-демонстрация

Вывод

<?xml version="1.0" encoding="UTF-8"?>
<Carton>
   <CartonDetails>
      <LineNumber>1</LineNumber>
      <ArticleNumber>261087750000</ArticleNumber>
      <Quantity>66</Quantity>
   </CartonDetails>
   <CartonDetails>
      <LineNumber>2</LineNumber>
      <ArticleNumber>261135720000</ArticleNumber>
      <Quantity>12</Quantity>
   </CartonDetails>
   <CartonDetails>
      <LineNumber>2</LineNumber>
      <ArticleNumber>261087840000</ArticleNumber>
      <Quantity>6</Quantity>
   </CartonDetails>
</Carton>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...