Генерация всей комбинации значений элементов, если ссылки совпадают - PullRequest
0 голосов
/ 01 ноября 2018

Я борюсь с этим XML, который имеет неоднородные структуры. Первый <Report_Data> должен быть ссылкой на 2-й и 3-й <Report_Data>. Итак, что произойдет, если GL_Code и Code совпадают с PT-BU_Code, значения их элементов должны быть скопированы. Если нет никаких дополнительных сведений о 2-м и 3-м <Report_Data> для 1-го <Report_Data>, записи должны быть сохранены.

<RaaSData>
<Report_Data xmlns:wd="urn:com.bsvc">
    <Report_Entry>
        <PT-BU>A0003 SPL</PT-BU>
        <PT-BU_Code>A0003</PT-BU_Code>
    </Report_Entry>
    <Report_Entry>
        <PT-BU>CAN01 RIS</PT-BU>
        <PT-BU_Code>CAN01</PT-BU_Code>
    </Report_Entry>
    <Report_Entry>
        <PT-BU>NL001 REG</PT-BU>
        <PT-BU_Code>NL001</PT-BU_Code>
    </Report_Entry>
    <Report_Entry>
        <PT-BU>ZA009 CJH</PT-BU>
        <PT-BU_Code>ZA009</PT-BU_Code>
    </Report_Entry>
</Report_Data>
<Report_Data xmlns:wd="urn:com.bsvc">
    <Report_Entry>
        <GL_Code>A0003</GL_Code>
        <Book_Code>G</Book_Code>
    </Report_Entry>
    <Report_Entry>
        <GL_Code>A0003</GL_Code>
        <Book_Code>L</Book_Code>
    </Report_Entry>
    <Report_Entry>
        <GL_Code>CAN01</GL_Code>
        <Book_Code>L</Book_Code>
    </Report_Entry>
</Report_Data>
<Report_Data xmlns:wd="urn:com.bsvc">
    <Report_Entry>
        <Cost_Center>67902 CC</Cost_Center>
        <COMPANY>
            <Code>A0003</Code>
        </COMPANY>
    </Report_Entry>
    <Report_Entry>
        <Cost_Center>99999 CC</Cost_Center>
        <COMPANY>
            <Code>A0003</Code>
        </COMPANY>
        <COMPANY>
            <Code>NL001</Code>
        </COMPANY>
    </Report_Entry>
</Report_Data>
</RaaSData>

Я не совсем уверен, как запустить мой XSLT, но вот пример вывода, который я хотел бы получить (в порядке возрастания на основе PT-BU_Code). Обратите внимание, что новые записи генерируются и являются уникальными в зависимости от значений элементов, указанных во 2-й и 3-й <Report_Data>.

Company;Code;Cost Center;Book Code
A0003 SPL;A0003;67902 CC;G
A0003 SPL;A0003;67902 CC;L
A0003 SPL;A0003;99999 CC;G
A0003 SPL;A0003;99999 CC;L
CAN01 RIS;CAN01;;L
NL001 REG;NL001;99999 CC;
ZA009 CJH;ZA009;;

1 Ответ

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

Вы можете использовать ключи для поиска компании и регистрации информации

<xsl:key name="book" match="Report_Entry" use="GL_Code" />
<xsl:key name="company" match="Report_Entry" use="COMPANY/Code" />

Но тогда это становится немного грязным, так как вам нужно проверить случай, когда у вас есть книга, но нет компании, или компания, но нет книги, или и то, и другое.

Попробуйте это XSLT

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

  <xsl:key name="book" match="Report_Entry" use="GL_Code" />
  <xsl:key name="company" match="Report_Entry" use="COMPANY/Code" />

  <xsl:template match="RaaSData">
    <xsl:text>Company;Code;Cost Center;Book Code&#10;</xsl:text>
    <xsl:for-each select="Report_Data[1]/Report_Entry">
      <xsl:variable name="bu" select="PT-BU_Code" />
      <xsl:variable name="prefix" select="concat(PT-BU, ';', $bu, ';')" />
      <xsl:for-each select="key('company', $bu)">
        <xsl:variable name="company" select="Cost_Center" />
        <xsl:for-each select="key('book', $bu)">
          <xsl:value-of select="concat($prefix, $company, ';', Book_Code, '&#10;')" />
        </xsl:for-each>
        <xsl:if test="not(key('book', $bu))">
          <xsl:value-of select="concat($prefix, $company, ';', '&#10;')" />
        </xsl:if>
      </xsl:for-each>
      <xsl:if test="not(key('company', $bu))">
        <xsl:for-each select="key('book', $bu)">
          <xsl:value-of select="concat($prefix, ';', Book_Code, '&#10;')" />
        </xsl:for-each>
        <xsl:if test="not(key('book', $bu))">
          <xsl:value-of select="concat($prefix, ';', '&#10;')" />
        </xsl:if>
      </xsl:if>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...