Удаление родительских тегов, имеющих дочерние теги с дублирующимися значениями - PullRequest
0 голосов
/ 04 ноября 2019

Как удалить родительские теги, имеющие дочерние теги с дублирующимися значениями.

Я уже использовал код для внесения некоторых изменений, но не смог получить все результаты. Это был вывод, который я получал

<?xml version="1.0" encoding="UTF-8"?>
    <Envelope xmlns="http://schemas.microsoft.com/dynamics/2011/01/documents/Message">

    <Header> </Header>
      <Body>
        <MessageParts xmlns="http://schemas.microsoft.com/dynamics/2011/01/documents/Message">
          <Run xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/Run">

            <RunObject class="entity">
              <A1>NA</A1>
              <A2>False</A2>
              <A3>02</A3>
              <A4>ER</A4>
            </RunObject>

            <RunObject class="entity">
              <A1>NA</A1>
              <A2>False</A2>
              <A3>03</A3>
              <A4>ER</A4>
            </RunObject>

             <RunObject class="entity">
              <A1>NA</A1>
              <A2>False</A2>
              <A3>02</A3>
              <A4>ER</A4>
            </RunObject>

             <RunObject class="entity">
              <A1>NA</A1>
              <A2>False</A2>
              <A3>02</A3>
              <A4>ER</A4>
            </RunObject>


          </Run>
        </MessageParts>
      </Body>
    </Envelope>

Я хотел удалить пространства имен, переименовать родительские теги, изменить порядок дочерних тегов и удалить родительские теги, имеющие дочерние теги с дублирующимися значениями.

Итак, я использовал этот код

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:m="http://schemas.microsoft.com/dynamics/2011/01/documents/Message"
    xmlns:r="http://schemas.microsoft.com/dynamics/2008/01/documents/Run"
    exclude-result-prefixes="m r">
      <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
      <xsl:strip-space elements="*"/>
      <xsl:key name="RunObject" match="r:RunObject[@class='entity']" use="concat(generate-id(parent::*), A1, '|', A2, '|' , A3, '|' , A4  )" />

      <!-- move all elements to no namespace -->
      <xsl:template match="*">
        <xsl:element name="{local-name()}">
          <xsl:copy-of select="@*"/>
          <xsl:apply-templates/>
        </xsl:element>
      </xsl:template>

      <!-- rename MessageParts to Document + skip the Run wrapper -->
      <xsl:template match="m:MessageParts">
        <Document>
          <xsl:apply-templates select="r:Run/*"/>
        </Document>
      </xsl:template>

     <!-- Removing duplicate parent tags -->
      <xsl:template match="r:Run">
        <xsl:copy>
          <xsl:apply-templates select="r:RunObject[@class='entity'][generate-id(.) = generate- 
          id(key('RunObject', concat(generate-id(parent::*), A1, '|', A2, '|' ,  
         A3, '|' , A4)) [1])]" />
       </xsl:copy>
      </xsl:template>
      <!-- rename RunObject to Item + reorder child nodes -->
      <xsl:template match="r:RunObject[@class='entity']">
        <Item>

          <xsl:apply-templates select="r:A3" />
          <xsl:apply-templates select="r:A4" />
          <xsl:apply-templates select="r:A2" />
          <xsl:apply-templates select="r:A1" />
        </Item>
      </xsl:template>

    </xsl:stylesheet>

Я смог удалить пространства имен, переименовать родительские теги и переставить дочерние теги, но не смог удалить родительские тегииметь дочерние теги с повторяющимися значениями. Это вывод, который я получил после использования вышеуказанного кода

<?xml version="1.0" encoding="UTF-8"?>
<Envelope>

  <Header> </Header>
  <Body>
    <Document>

      <Item>
        <A3>02</A3>
        <A4>ER</A4>
        <A2>False</A2>
        <A1>NA</A1>
      </Item>

      <Item>
        <A3>03</A3>
        <A4>ER</A4>
        <A2>False</A2>
        <A1>NA</A1>
      </Item>

      <Item>
        <A3>02</A3>
        <A4>ER</A4>
        <A2>False</A2>
        <A1>NA</A1>
      </Item>

      <Item>
        <A3>02</A3>
        <A4>ER</A4>
        <A2>False</A2>
        <A1>NA</A1>
      </Item>

    </Document>
  </Body>
</Envelope>

Это ожидаемый вывод

 <?xml version="1.0" encoding="UTF-8"?>
    <Envelope>

      <Header> </Header>
      <Body>
        <Document>

          <Item>
            <A3>02</A3>
            <A4>ER</A4>
            <A2>False</A2>
            <A1>NA</A1>
          </Item>

          <Item>
            <A3>03</A3>
            <A4>ER</A4>
            <A2>False</A2>
            <A1>NA</A1>
          </Item>

       </Document>
     </Body>
    </Envelope>
...