Как обновить диапазон тега файла XMl? - PullRequest
0 голосов
/ 27 мая 2018

Моя проблема в том, что я не знаю, как обновить файл XML.В следующем XML-файле я хочу включить некоторые теги в другой тег, который уже существует в файле.
** Мой XML-файл выглядит следующим образом: **

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <PayrunDetails>
        <PayrunNumber>000777</PayrunNumber>
    </PayrunDetails>
    <PayLocation>
        <LocationCode>ACT</LocationCode>
        <LocationDescription>ACT</LocationDescription>
        <CompanyDetails>
            <CName>APPLE Limited</CName>
            <Payslip>
                <StaffNumber>12345</StaffNumber>
                <PayDetails>
                    <AmountGross>9999</AmountGross>
                    <ComponentDetails>
                        <ComponentType>SALARY</ComponentType>
                        <Amount>1999</Amount>
                        <YTDAmount>10616</YTDAmount>
                    </ComponentDetails>
                    <ComponentDetails>
                        <ComponentType>SALARY</ComponentType>
                        <Amount>7305</Amount>
                        <YTDAmount>76703</YTDAmount>
                    </ComponentDetails>
                </PayDetails>
            </Payslip>
        </CompanyDetails>
    </PayLocation>
</root>

Мой желаемыйВыходной файл выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <PayrunDetails>
        <PayrunNumber>000777</PayrunNumber>
    </PayrunDetails>
    <PayLocation>
        <LocationCode>ACT</LocationCode>
        <LocationDescription>ACT</LocationDescription>
        <CompanyDetails>
            <CName>APPLE Limited</CName>
            <Payslip>
                <StaffNumber>12345</StaffNumber>
                <PayDetails>
                    <AmountGross>9999</AmountGross>
                    <ComponentDetails>
                        <ComponentType ID="SALARY">
                            <Amount>1999</Amount>
                            <YTDAmount>10616</YTDAmount>
                        </ComponentType>
                    </ComponentDetails>
                    <ComponentDetails>
                        <ComponentType ID="TAX">
                            <Amount>7305</Amount>
                            <YTDAmount>76703</YTDAmount>
                        </ComponentType>
                    </ComponentDetails>
                </PayDetails>
            </Payslip>
        </CompanyDetails>
    </PayLocation>
</root>

В указанном выше желаемом файле вы обнаружите, что тег ComponentType включил остальные теги, существующие внутри тега ComponentDetails.

ДляВышеупомянутая проблема, я хочу использовать XSLT, но я не знаю, какой код мне написать, чтобы получить решение.
Я довольно плохо знаком с XSLT, поэтому прошу прощения за потенциальный вопрос новичка.Любое руководство будет оценено здесь.Заранее спасибо.

1 Ответ

0 голосов
/ 27 мая 2018

Сначала прочитайте преобразование i dentity в XSLT, которое включает этот шаблон

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

(Если бы вы могли использовать XSLT 3.0, вы могли бы просто написать <xsl:mode on-no-match="shallow-copy"/> вместо этого)

Это скопирует все ваши узлы и атрибуты «как есть», что в вашем случае приведет вас почти к этому.

Существует несколько способов преобразования нужных вам узлов.Одним из способов является сопоставление тега ComponentDetails для создания нового ComponentType в выводе вместе с кодом для выбора других дочерних узлов.

<xsl:template match="ComponentDetails">
  <xsl:copy>
      <ComponentType ID="{ComponentType}">
          <xsl:apply-templates />
      </ComponentType>
  </xsl:copy>
</xsl:template>

При этом используется Значение атрибутаШаблоны для создания атрибута ID.

Обратите внимание, что <xsl:apply-templates /> является сокращением для <xsl:apply-templates select="node()" />, и поэтому он все равно выберет существующий элемент ComponentType во входном документе, который будетзатем сопоставить с шаблоном идентификации.Чтобы прекратить вывод ComponentType дважды, необходимо добавить соответствующий шаблон и проигнорировать его.

<xsl:template match="ComponentType" />

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

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="xml" indent="yes" html-version="5"/>

  <xsl:strip-space elements="*" />

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

  <xsl:template match="ComponentDetails">
    <xsl:copy>
        <ComponentType ID="{ComponentType}">
            <xsl:apply-templates />
        </ComponentType>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="ComponentType" />
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...