Как проверить брата для вывода правильных данных после группировки? - PullRequest
0 голосов
/ 01 апреля 2020

Я хочу сгруппировать по ссылке ниже. XML входной файл

<root>
<row>
<Company>HHH</Company>
<Posting_Key>40</Posting_Key>
<Reference>12345</Reference>
<Assignment>54321</Assignment>
</row>
<row>
<Company>HHH</Company>
<Posting_Key>15</Posting_Key>
<Reference>12345</Reference>
<Assignment>321</Assignment>
</row>
<row>
<Company>HHH</Company>
<Posting_Key>15</Posting_Key>
<Reference>12345</Reference>
<Assignment>311</Assignment>
</row>
<root>
<row>
<Company>SSS</Company>
<Posting_Key>40</Posting_Key>
<Reference>67890</Reference>
<Assignment>78968</Assignment>
</row>
<row>
<Company>SSS</Company>
<Posting_Key>15</Posting_Key>
<Reference>67890</Reference>
<Assignment>98769</Assignment>
</row>

Требуемый вывод, где ключ проводки 40 находится внутри строки, а ключ проводки 15 находится внутри деталей в этой строке.

<root>
    <row>
    <Company>HHH</Company>
    <Posting_Key>40</Posting_Key>
    <Reference>12345</Reference>
    <Assignment>54321</Assignment>
         <details>
            <Company>HHH</Company>
            <Posting_Key>15</Posting_Key>
            <Reference>12345</Reference>
            <Assignment>54321</Assignment>
         </details>
         <details>
              <Company>HHH</Company>
              <Posting_Key>15</Posting_Key>
              <Reference>12345</Reference>
               <Assignment>311</Assignment>
         </details>
    </row>
    <row>
     <Company>SSS</Company>
    <Posting_Key>40</Posting_Key>
    <Reference>67890</Reference>
    <Assignment>78968</Assignment>
         <details>
            <Company>SSS</Company>
            <Posting_Key>15</Posting_Key>
            <Reference>67890</Reference>
            <Assignment>98769</Assignment>
         </details>
  </row>
</root>

Текущий XSL-код, он получает только те данные в строке, где ключ проводки равен 40. Как проверить одноуровневый ключ проводки 40 или 15 для вывода правильного значения в разделе сведений?

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
<xsl:template match="root">
<root>
<xsl:for-each-group select="row[Posting_Key='40']" group-by="Reference">
<row>
<xsl:value-of select="Company_Code"/>
<xsl:value-of select="Posting_Key"/>
<xsl:value-of select="Reference"/>
<xsl:value-of select="Assignment"/>
<xsl:for-each select="current-group()">
<details>
<xsl:value-of select="Company_Code"/>
<xsl:value-of select="Posting_Key"/>
<xsl:value-of select="Reference"/>
<xsl:value-of select="Assignment"/>
</details>
</xsl:for-each>
</row>
</xsl:for-each-group>
</root>
</xsl:template>
</xsl:stylesheet>

это только позволяет получить данные в строке, где ключ проводки равен 40. Как проверить родственный ключ отправки 40 или 15, чтобы вывести правильное значение в разделе сведений?

1 Ответ

0 голосов
/ 01 апреля 2020

Похоже, вы скорее хотите использовать group-starting-with, чем group-by:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all"
    version="3.0">

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:output indent="yes"/>

  <xsl:template match="root">
      <xsl:copy>
          <xsl:for-each-group select="row" group-starting-with="row[Posting_Key = 40]">
              <xsl:copy>
                  <xsl:apply-templates/>
                  <xsl:apply-templates select="tail(current-group())"/>
              </xsl:copy>
          </xsl:for-each-group>
      </xsl:copy>
  </xsl:template>

  <xsl:template match="row">
      <details>
          <xsl:apply-templates/>
      </details>
  </xsl:template>

</xsl:stylesheet>

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

...