Добавление нового родительского узла с использованием XSLT - PullRequest
0 голосов
/ 17 мая 2019

У меня есть простой XML следующим образом

    <?xml version="1.0" encoding="UTF-8"?>
    <StockLevelReportingExt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
       <Envelope>
          <SenderIdentification>USLAX19</SenderIdentification>
       </Envelope>
       <Message>
          <ArticleInformation>
             <SmallNormalID>2</SmallNormalID>
             <SerialNumbersPerSKU>0</SerialNumbersPerSKU>
          </ArticleInformation>
          <SubtotalsInformation>
             <TaxedFlag>0</TaxedFlag>
             <Depot>U15</Depot>
          </SubtotalsInformation>
       </Message>
       <Message>
          <ArticleInformation>
             <SmallNormalID>2</SmallNormalID>
             <SerialNumbersPerSKU>0</SerialNumbersPerSKU>
          </ArticleInformation>
          <SubtotalsInformation>
             <TaxedFlag>0</TaxedFlag>
             <Depot>U15</Depot>
          </SubtotalsInformation>
       </Message>
    </StockLevelReportingExt>

Мне нужно добавить родительский узел, охватывающий все <Messages> под одним <Messages> родительским узлом.

Таким образом, полученный xml должен выглядеть следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
        <StockLevelReportingExt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
           <Envelope>
              <SenderIdentification>USLAX19</SenderIdentification>
           </Envelope>
           <Messages> // Newly added node
              <Message>
                 <ArticleInformation>
                    <SmallNormalID>2</SmallNormalID>
                    <SerialNumbersPerSKU>0</SerialNumbersPerSKU>
                  </ArticleInformation>
                 <SubtotalsInformation>
                    <TaxedFlag>0</TaxedFlag>
                    <Depot>U15</Depot>
                 </SubtotalsInformation>
              </Message>
              <Message>
                 <ArticleInformation>
                    <SmallNormalID>2</SmallNormalID>
                    <SerialNumbersPerSKU>0</SerialNumbersPerSKU>
                 </ArticleInformation>
                 <SubtotalsInformation>
                    <TaxedFlag>0</TaxedFlag>
                    <Depot>U15</Depot>
                 </SubtotalsInformation>
              </Message>
           </Messages>   
        </StockLevelReportingExt>

Как мне достичь ожидаемого результата? Я попробовал следующий код, чтобы добавить родительский узел к <Message>, но он не работает.

<?xml version="1.0"?>
<xsl:stylesheet xmlns:ifs="urn:ifsworld-com:schemas:TYPE_SCHEMA_NAME_HERE" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:date="http://exslt.org/dates-and-times" version="1.0" exclude-result-prefixes="ifs date">
<xsl:output method="xml" indent="yes"/>

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

  <xsl:template match="Message">
    <xsl:copy>
      <xsl:element name="Messages"/>
      <xsl:apply-templates select="@* | *"/> 
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

1 Ответ

0 голосов
/ 17 мая 2019

Это будет делать:

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

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

  <xsl:template match="StockLevelReportingExt">
    <xsl:copy>
      <xsl:apply-templates select="@* |node()[not(self::Message)]"/>
      <Messages>
        <xsl:apply-templates select="Message"/>
      </Messages>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

Выход:

<?xml version="1.0" encoding="utf-8"?>
<StockLevelReportingExt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Envelope>
    <SenderIdentification>USLAX19</SenderIdentification>
  </Envelope>
  <Messages>
    <Message>
      <ArticleInformation>
        <SmallNormalID>2</SmallNormalID>
        <SerialNumbersPerSKU>0</SerialNumbersPerSKU>
      </ArticleInformation>
      <SubtotalsInformation>
        <TaxedFlag>0</TaxedFlag>
        <Depot>U15</Depot>
      </SubtotalsInformation>
    </Message>
    <Message>
      <ArticleInformation>
        <SmallNormalID>2</SmallNormalID>
        <SerialNumbersPerSKU>0</SerialNumbersPerSKU>
      </ArticleInformation>
      <SubtotalsInformation>
        <TaxedFlag>0</TaxedFlag>
        <Depot>U15</Depot>
      </SubtotalsInformation>
    </Message>
  </Messages>
</StockLevelReportingExt>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...