Обновление файла XML и присвоение идентификатора тегу с помощью XSLT - PullRequest
0 голосов
/ 26 мая 2018

Я хочу обновить XML-файл и назначить идентификатор тегу.В моем XML-файле есть тег с именем «ComponentDetails», потому что есть несколько тегов с одним и тем же именем, поэтому я хочу назначить ему идентификатор, чтобы я мог выбирать конкретные значения на основе идентификатора.
мой пример XML:

    <?xml version="1.0" encoding="UTF-8"?><root>
    <PayrunDetails>
        <PayrunNumber>000777</PayrunNumber>
        <PaidDate>2018-05-15</PaidDate>
    </PayrunDetails>
    <PayLocation>
        <LocationCode>ACT</LocationCode>
        <LocationDescription>ACT</LocationDescription>
        <CompanyDetails>
            <CCode>APPLE</CCode>
            <CName>APPLE Limited</CName>
            <Payslip>
                <StaffNumber>12345</StaffNumber>
                <BankDetails>
                    <BankAccountNo>121212</BankAccountNo>
                </BankDetails>
                <PayDetails>
                    <PayType>NORMAL</PayType>
                    <AmountGross>9999</AmountGross>
                    <ComponentDetails>
                        <ComponentType>SALARY</ComponentType>
                        <Amount>1999</Amount>
                        <YTDAmount>10616</YTDAmount>
                    </ComponentDetails>
                    <ComponentDetails>
                        <ComponentType>TAXABLE</ComponentType>
                        <Amount>505</Amount>
                        <YTDAmount>7703</YTDAmount>
                    </ComponentDetails>
                </PayDetails>
            </Payslip>
            <Payslip>
                <StaffNumber>45555</StaffNumber>
                <BankDetails>
                    <BankAccountNo>131313</BankAccountNo>
                </BankDetails>
                <PayDetails>
                    <PayType>NORMAL</PayType>
                    <AmountGross>9999</AmountGross>
                    <ComponentDetails>
                        <ComponentType>SALARY</ComponentType>
                        <Amount>1999</Amount>
                        <YTDAmount>10616</YTDAmount>
                    </ComponentDetails>
                    <ComponentDetails>
                        <ComponentType>GROSS</ComponentType>
                        <Amount>7305</Amount>
                        <YTDAmount>76703</YTDAmount>
                    </ComponentDetails>
                    <ComponentDetails>
                        <ComponentType>TAXABLE</ComponentType>
                        <Amount>305</Amount>
                        <YTDAmount>6703</YTDAmount>
                    </ComponentDetails>
                </PayDetails>
            </Payslip>
        </CompanyDetails>
    </PayLocation>
</root>

В приведенном выше XML-файле я хочу выбрать значения Subtags Amount, YTDAmount, которые существуют внутри тегов ComponentDetails.Каким-то образом мне удается присвоить идентификатор тэгам ComponentDetails, но, к сожалению, внутри вновь созданного XML-файла существуют подтэги, которых нет.
Мой XSL-файл выглядит следующим образом:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <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>
          <xsl:attribute name="ID">
            <xsl:number/>
          </xsl:attribute>
          <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
</xsl:template>
</xsl:stylesheet>

Поэтому, пожалуйста, предоставьте мне решение для создания файла XML с идентификатором тега.Я довольно новичок в XSLT, поэтому прошу прощения за потенциальный вопрос новичка.Любое руководство будет оценено здесь.
Спасибо заранее.

Я внес следующее изменение, и оно работает:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="PayDetails/ComponentDetails">
    <xsl:copy>
      <xsl:attribute name="ID">
        <xsl:number/>
      </xsl:attribute>
      <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
  </xsl:template>

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

</xsl:stylesheet>

1 Ответ

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

Вы должны избавиться от строки

<xsl:template match="ComponentDetails/node()"/>

, потому что она удаляет все подтэги элемента ComponentDetails.


Кроме того, если вы хотите глобально уникальныйID, измените элемент <xsl:number/> на

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