Скопируйте предыдущий xml контент и добавьте новый тег, если он отсутствует - PullRequest
0 голосов
/ 22 апреля 2020

Будет весьма полезно, если вы сможете высказать свои лучшие мысли о xslt и о простейшем способе достижения результата ниже.

Случай 1: -На счет / acc4300, если поле empid отсутствует. Решение: - Прочтите значение empid из учетной записи / Fintrans [1] / acc4300 и поместить его в учетную запись / acc4300

Случай 2: - Под учетной записью / acc4300, если поле empid уже существует Решение: - Ничего не делать

Случай 3: - Если учетная запись / acc4300 отсутствует Решение: - Ничего не делать

Ввод XML:

<Root>
<corp att="abc">
    <account number="111">
        <acc4300>
            <name>stack</name>
            //empid tag is not present here as in first occurance, so I want to read it from below node of Fintrans and the value should be 5678 in output xml
        </acc4300>
        <Fintrans>
            <Amount>12.00</Amount>
            <Tax>1.00</Tax>
            <empid>5678</empid>
        </fintrans>
        <Fintrans>
            <Amount>112.00</Amount>
            <Tax>13.00</Tax>
            <empid>5678</empid>
        </fintrans>
    </account>
<account number="321">
        <acc4300>
            <name>stack1</name>
            //empid tag is not present here as in first occurance, so I want to read it from below node of Fintrans and the value should be 5678 in output xml
        </acc4300>
        <Fintrans>
            <Amount>152.00</Amount>
            <Tax>19.00</Tax>
            <empid>9734</empid>
        </fintrans>
        <Fintrans>
            <Amount>142.00</Amount>
            <Tax>17.00</Tax>
            <empid>9734</empid>
        </fintrans>
    </account>
    <account number="222">
        <acc4300>
            <name>overflow</name>
            <empid>1234</empid>
            // Do nothing to employee id as already in input file empid is present under node acc4300
        </acc4300>
        <Fintrans>
            <Amount>121.00</Amount>
            <Tax>15.00</Tax>
            <empid>1234</empid>
        </fintrans>
        <Fintrans>
            <Amount>122.00</Amount>
            <Tax>15.00</Tax>
            <empid>1234</empid>
        </fintrans>
    </account>
    <account number="333">
        //Since acc400 tag is missing in this block do nothing.
        <Fintrans>
            <Amount>12.00</Amount>
            <Tax>1.00</Tax>
            <empid>4285</empid>
        </fintrans>
        <Fintrans>
            <Amount>112.00</Amount>
            <Tax>13.00</Tax>
            <empid>4285</empid>
        </fintrans>
    </account>
</corp>
<corp att="asfd">
...........
...........
...........
</corp>
</Root>

Результат должен выглядеть следующим образом

<Root>
<corp att="abc">
    <account number="111">
        <acc4300>
            <name>stack</name>
            <empid>5678</empid>
        </acc4300>
        <Fintrans>
            <Amount>12.00</Amount>
            <Tax>1.00</Tax>
            <empid>5678</empid>
        </fintrans>
        <Fintrans>
            <Amount>112.00</Amount>
            <Tax>13.00</Tax>
            <empid>5678</empid>
        </fintrans>
    </account>
    <account number="321">
        <acc4300>
            <name>stack1</name>
            <empid>9734</empid>
        </acc4300>
        <Fintrans>
            <Amount>152.00</Amount>
            <Tax>19.00</Tax>
            <empid>9734</empid>
        </fintrans>
        <Fintrans>
            <Amount>142.00</Amount>
            <Tax>17.00</Tax>
            <empid>9734</empid>
        </fintrans>
    </account>
    <account number="222">
        <acc4300>
            <name>overflow</name>
            <empid>1234</empid>
        </acc4300>
        <Fintrans>
            <Amount>121.00</Amount>
            <Tax>15.00</Tax>
            <empid>1234</empid>
        </fintrans>
        <Fintrans>
            <Amount>122.00</Amount>
            <Tax>15.00</Tax>
            <empid>1234</empid>
        </fintrans>
    </account>
    <account number="333">
        <Fintrans>
            <Amount>12.00</Amount>
            <Tax>1.00</Tax>
            <empid>4285</empid>
        </fintrans>
        <Fintrans>
            <Amount>112.00</Amount>
            <Tax>13.00</Tax>
            <empid>4285</empid>
        </fintrans>
    </account>
</corp>
<corp att="asfd">
...........
...........
...........
</corp>
</Root>

Примечание : - Это образец XML, и у меня есть более 500 других полей в исходном XML, поэтому написание XSLT для каждого узла невозможно. Пожалуйста, предложите любой лучший способ с версией 1.0 или 2.0 XSLT.

1 Ответ

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

Вот как это можно сделать.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="acc4300">
      <xsl:copy>
          <xsl:apply-templates/>
          <xsl:if test="not(empid)">
              <empid><xsl:value-of select="../fintrans[1]/empid"/></empid>
          </xsl:if>
      </xsl:copy>
  </xsl:template>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

Посмотрите, как это работает здесь: https://xsltfiddle.liberty-development.net/pNmC4J2/1

...