Соедините данные двух узлов в XML, используя XSLT - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть XML файл, как показано ниже

<message>
  <swap>
    <clause>
      <genclause name="TRADE_DESC">
        <startdate>2019-07-01</startdate>
        <min>-1000.000000000000</min>
        <max>20.050000000000</max>
        <comment>AAA.USD</comment>
      </genclause>
      <genclause name="TRADE_DESC">
        <startdate>2019-09-09</startdate>
        <min>-1000.000000000000</min>
        <max>24.880000000000</max>
        **<comment>AAA.USD</comment>**
      </genclause>
      <genclause name="TRADE_DESC">
        <startdate>2019-09-09</startdate>
        <min>-2500.000000000000</min>
        <max>45.010000000000</max>
        <comment>BBB.USD</comment>
      </genclause>
      <genclause name="TRADE_DESC">
        <startdate>2019-09-09</startdate>
        <min>1500.000000000000</min>
        <max>87.450000000000</max>
        <comment>CCC.USD</comment>
      </genclause>
    </clause>
  </swap>


  <share>
    <identifier>
      **<reference name="SecID">AAA.USD</reference>**
      <reference name="Exchg">Q</reference>
      <reference name="ISNO">UBSGFD321313</reference>
      <reference name="SYMB">AAA</reference>
      </reference>
    </identifier>
    <name>AAAAA AAAAAA AAAAAAA</name>
  </share>
  <share>
    <identifier>
      <reference name="SecID">BBB.USD</reference>
      <reference name="Exchg">N</reference>
      <reference name="ISNO">QEIRUYW313</reference>
      <reference name="SYMB">BBB</reference>
      </reference>
    </identifier>
    <name>BBBB BBBBBBB BBBBBB</name>
  </share>
</message>

(1) Для каждого значения узла AAA.USD в "swap / clause / genclause / comment", который я хочу найти соответствующее значение узла в "share / identifier / reference [@ name = 'SecID']" (здесь это будет AAA.USD

(2). Затем выберите все значения дочернего узла из оба узла в «swap / clause / genclause» и «share / identifier».

(3) Вывод XML должен быть таким:

<AnexTwoInfo>
  <TradeData>
    <SecID>AAA.USD<SecID>
    <min>1000</min>
    <max>24.88</max>
    <Trade_Date>2019-09-09</Trade_Date>
    <name>>AAAAA AAAAAA AAAAAAA</name>
    <Exchange>Q</xchange>
    <ISNO>UBSGFD321313</ISNO>
  </TradeData>
...
...
...

<AnexTwoInfo>

Может кто-нибудь, пожалуйста, помогите мне «Только что начал работать над XML / XSLT, и это очень сильно почесывает мою голову.

Для этого XML / XSLT я должен использовать ТОЛЬКО версию 1.0. Это ограничение.

Пожалуйста, дайте Я знаю, если я должен предоставить дополнительную информацию по этому вопросу.

Спасибо.

1 Ответ

1 голос
/ 06 февраля 2020

XSLT имеет встроенный ключ механизм разрешения перекрестных ссылок. В вашем примере это может работать так:

XSLT 1.0

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

<xsl:key name="share" match="share" use="identifier/reference[@name='SecID']"/>

<xsl:template match="/message">
    <AnexTwoInfo>
        <xsl:for-each select="swap/clause/genclause">
            <TradeData>
                <SecID>
                    <xsl:value-of select="comment"/>
                </SecID>
                <!-- more nodes here -->
                <xsl:copy-of select="key('share', comment)/name"/>
            </TradeData>
        </xsl:for-each>
    </AnexTwoInfo>
</xsl:template>

</xsl:stylesheet>

Когда это применяется к правильно сформированным (!) input:

XML

<message>
  <swap>
    <clause>
      <genclause name="TRADE_DESC">
        <startdate>2019-07-01</startdate>
        <min>-1000.000000000000</min>
        <max>20.050000000000</max>
        <comment>AAA.USD</comment>
      </genclause>
      <genclause name="TRADE_DESC">
        <startdate>2019-09-09</startdate>
        <min>-1000.000000000000</min>
        <max>24.880000000000</max>
        <comment>AAA.USD</comment>
      </genclause>
      <genclause name="TRADE_DESC">
        <startdate>2019-09-09</startdate>
        <min>-2500.000000000000</min>
        <max>45.010000000000</max>
        <comment>BBB.USD</comment>
      </genclause>
      <genclause name="TRADE_DESC">
        <startdate>2019-09-09</startdate>
        <min>1500.000000000000</min>
        <max>87.450000000000</max>
        <comment>CCC.USD</comment>
      </genclause>
    </clause>
  </swap>

  <share>
    <identifier>
      <reference name="SecID">AAA.USD</reference>
      <reference name="Exchg">Q</reference>
      <reference name="ISNO">UBSGFD321313</reference>
      <reference name="SYMB">AAA</reference>
    </identifier>
    <name>AAAAA AAAAAA AAAAAAA</name>
  </share>
  <share>
    <identifier>
      <reference name="SecID">BBB.USD</reference>
      <reference name="Exchg">N</reference>
      <reference name="ISNO">QEIRUYW313</reference>
      <reference name="SYMB">BBB</reference>
    </identifier>
    <name>BBBB BBBBBBB BBBBBB</name>
  </share>
</message>

он выдаст:

Результат

<?xml version="1.0" encoding="UTF-8"?>
<AnexTwoInfo>
  <TradeData>
    <SecID>AAA.USD</SecID>
    <name>AAAAA AAAAAA AAAAAAA</name>
  </TradeData>
  <TradeData>
    <SecID>AAA.USD</SecID>
    <name>AAAAA AAAAAA AAAAAAA</name>
  </TradeData>
  <TradeData>
    <SecID>BBB.USD</SecID>
    <name>BBBB BBBBBBB BBBBBB</name>
  </TradeData>
  <TradeData>
    <SecID>CCC.USD</SecID>
  </TradeData>
</AnexTwoInfo>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...