使用 xsl 展平 xml:盛大子节点元素的问题

穆贾希德·哈吉-泰布

我对xmlt很陌生,所以我想这是一个简单的问题。我想展平一个 xml,但没有出现 3 次,我有 2 次出现,第二次出现了与大子节点对应的重复元素

输入xml

<RL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="RL.xsd">
  <VERSION>2.3</VERSION>
  <RLM01A>NR110</RLM01A>
  <RLM02A>2019</RLM02A>
  <RLUEx>
    <RL0101>
      <RL0101x>
        <RL0101Ax>7</RL0101Ax>
        <RL0101Ex>CH</RL0101Ex>
        <RL0101Fx>N</RL0101Fx>
        <RL0101Gx>PARC ÉOLIEN</RL0101Gx>
      </RL0101x>
    </RL0101>
    <RL0104>
      <RL0104A>2228</RL0104A>
      <RL0104B>75</RL0104B>
      <RL0104C>6417</RL0104C>
    </RL0104>
    <RL0105A>4812</RL0105A>
    <RL0106A>110015</RL0106A>
    <RL0107A>1100</RL0107A>
    <RL0201>
      <RL0201x>
        <RL0201Ax>PARC ÉOLIEN NICOLAS-RIOU COMMANDITÉ INC.</RL0201Ax>
        <RL0201Cx>1010 DE LA GAUCHETIÈRE OUEST, 20E ÉTAGE</RL0201Cx>
        <RL0201Dx>MONTREAL (QUÉBEC)</RL0201Dx>
        <RL0201Ex>H3B2N2</RL0201Ex>
        <RL0201Fx>BUR. 2000 DÉVELOPPEMENT EDF RENOUVELABLES INC.</RL0201Fx>
        <RL0201Gx>2016-08-08</RL0201Gx>
        <RL0201Hx>2</RL0201Hx>
      </RL0201x>
      <RL0201U>9</RL0201U>
    </RL0201>
    <RL0303A>0</RL0303A>
    <RL0401A>2014-07-01</RL0401A>
    <RL0402A>6000</RL0402A>
    <RL0404A>6000</RL0404A>
    <RL0405A>6000</RL0405A>
    <RL0501A>0</RL0501A>
    <RL0504>
      <RL0504x>
        <RL0504Ax>F-2.1</RL0504Ax>
        <RL0504Bx>204</RL0504Bx>
        <RL0504Cx>7</RL0504Cx>
        <RL0504Dx>6000</RL0504Dx>
        <RL0504Ex>T</RL0504Ex>
        <RL0504Fx>2</RL0504Fx>
      </RL0504x>
      <RL0504x>
        <RL0504Dx>6000</RL0504Dx>
        <RL0504Ex>I</RL0504Ex>
        <RL0504Fx>2</RL0504Fx>
      </RL0504x>
    </RL0504>
  </RLUEx>
  <RLUEx>
    <RL0101>
      <RL0101x>
        <RL0101Ax>8</RL0101Ax>
        <RL0101Ex>CH</RL0101Ex>
        <RL0101Fx>N</RL0101Fx>
        <RL0101Gx>PARC ÉOLIEN</RL0101Gx>
      </RL0101x>
    </RL0101>
    <RL0104>
      <RL0104A>2230</RL0104A>
      <RL0104B>78</RL0104B>
      <RL0104C>8650</RL0104C>
    </RL0104>
    <RL0105A>4812</RL0105A>
    <RL0106A>110016</RL0106A>
    <RL0107A>1100</RL0107A>
    <RL0201>
      <RL0201x>
        <RL0201Ax>PARC ÉOLIEN NICOLAS-RIOU COMMANDITÉ INC.</RL0201Ax>
        <RL0201Cx>1010 DE LA GAUCHETIÈRE OUEST, 20E ÉTAGE</RL0201Cx>
        <RL0201Dx>MONTREAL (QUÉBEC)</RL0201Dx>
        <RL0201Ex>H3B2N2</RL0201Ex>
        <RL0201Fx>BUR. 2000 DÉVELOPPEMENT EDF RENOUVELABLES INC.</RL0201Fx>
        <RL0201Gx>2016-08-08</RL0201Gx>
        <RL0201Hx>2</RL0201Hx>
      </RL0201x>
        <RL0201x>
        <RL0201Ax>FORESTERIE H.B. INC.</RL0201Ax>
        <RL0201Cx>263, RUE J.J. BÉLANGER</RL0201Cx>
        <RL0201Dx>RIVIÈRE-DU-LOUP (QUÉBEC)</RL0201Dx>
        <RL0201Ex>G5R5V9</RL0201Ex>
        <RL0201Fx>BÉRUBÉ HUGO A/S</RL0201Fx>
        <RL0201Gx>2010-10-26</RL0201Gx>
        <RL0201Hx>2</RL0201Hx>
      </RL0201x>
      <RL0201U>9</RL0201U>
    </RL0201>
    <RL0303A>0</RL0303A>
    <RL0401A>2014-07-01</RL0401A>
    <RL0402A>6000</RL0402A>
    <RL0404A>6000</RL0404A>
    <RL0405A>6000</RL0405A>
    <RL0501A>0</RL0501A>
    <RL0504>
      <RL0504x>
        <RL0504Ax>F-2.1</RL0504Ax>
        <RL0504Bx>204</RL0504Bx>
        <RL0504Cx>7</RL0504Cx>
        <RL0504Dx>6000</RL0504Dx>
        <RL0504Ex>T</RL0504Ex>
        <RL0504Fx>2</RL0504Fx>
      </RL0504x>
      <RL0504x>
        <RL0504Dx>6000</RL0504Dx>
        <RL0504Ex>I</RL0504Ex>
        <RL0504Fx>2</RL0504Fx>
      </RL0504x>
    </RL0504>
  </RLUEx>
  <RL0603A>M.R.C. LES BASQUES</RL0603A>
  </RL>

这是我的 xls

    <?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="iso-8859-1" indent="yes" omit-xml-declaration="no"/>
    <xsl:strip-space elements="*"/>

     <xsl:template match="/RL">
<root>

            <xsl:for-each select="RLUEx">
                <xsl:copy>
                <xsl:copy-of select="RL0101/RL0101x/RL0101Ax"/>
                <xsl:copy-of select="RL0101/RL0101x/RL0101Ex"/>
                <xsl:copy-of select="RL0101/RL0101x/RL0101Gx"/>
                <xsl:copy-of select="RL0103/RL0103x/RL0103Ax"/>
                <xsl:copy-of select="RL0105A"/>
                <xsl:copy-of select="RL0201/RL0201x/RL0201Ax"/>
                <xsl:copy-of select="RL0201/RL0201x/RL0201Cx"/>
                <xsl:copy-of select="RL0201/RL0201x/RL0201Dx"/>
                <xsl:copy-of select="RL0201/RL0201x/RL0201Ex"/>
                <xsl:copy-of select="RL0201/RL0201x/RL0201Gx"/>
                <xsl:copy-of select="RL0201/RL0201U"/>
                <xsl:copy-of select="RL0306/RL0306A"/>
                <xsl:copy-of select="RL0307/RL0307A"/>
                <xsl:copy-of select="RL0307/RL0307B"/>
                <xsl:copy-of select="RL0308/RL0308A"/>
                <xsl:copy-of select="RL0309/RL0309A"/>
                <xsl:copy-of select="RL0310/RL0310A"/>
                <xsl:copy-of select="RL0311/RL0311A"/>
                <xsl:copy-of select="RL0312/RL0312A"/>
                <xsl:copy-of select="RL0313/RL0313A"/>
                <xsl:copy-of select="../RL0603A"/>
                </xsl:copy>
            </xsl:for-each>



</root>
    </xsl:template>
</xsl:stylesheet>

这是我的输出

<?xml version="1.0" encoding="iso-8859-1"?>
<root>
  <RLUEx xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <RL0101Ax>7</RL0101Ax>
    <RL0101Ex>CH</RL0101Ex>
    <RL0101Gx>PARC ÉOLIEN</RL0101Gx>
    <RL0105A>4812</RL0105A>
    <RL0201Ax>PARC ÉOLIEN NICOLAS-RIOU COMMANDITÉ INC.</RL0201Ax>
    <RL0201Cx>1010 DE LA GAUCHETIÈRE OUEST, 20E ÉTAGE</RL0201Cx>
    <RL0201Dx>MONTREAL (QUÉBEC)</RL0201Dx>
    <RL0201Ex>H3B2N2</RL0201Ex>
    <RL0201Gx>2016-08-08</RL0201Gx>
    <RL0201U>9</RL0201U>
    <RL0603A>M.R.C. LES BASQUES</RL0603A>
  </RLUEx>
  <RLUEx xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <RL0101Ax>8</RL0101Ax>
    <RL0101Ex>CH</RL0101Ex>
    <RL0101Gx>PARC ÉOLIEN</RL0101Gx>
    <RL0105A>4812</RL0105A>
    <RL0201Ax>PARC ÉOLIEN NICOLAS-RIOU COMMANDITÉ INC.</RL0201Ax>
    <RL0201Ax>FORESTERIE H.B. INC.</RL0201Ax>
    <RL0201Cx>1010 DE LA GAUCHETIÈRE OUEST, 20E ÉTAGE</RL0201Cx>
    <RL0201Cx>263, RUE J.J. BÉLANGER</RL0201Cx>
    <RL0201Dx>MONTREAL (QUÉBEC)</RL0201Dx>
    <RL0201Dx>RIVIÈRE-DU-LOUP (QUÉBEC)</RL0201Dx>
    <RL0201Ex>H3B2N2</RL0201Ex>
    <RL0201Ex>G5R5V9</RL0201Ex>
    <RL0201Gx>2016-08-08</RL0201Gx>
    <RL0201Gx>2010-10-26</RL0201Gx>
    <RL0201U>9</RL0201U>
    <RL0603A>M.R.C. LES BASQUES</RL0603A>
  </RLUEx>
</root>

如您所见,我只有 2 次而不是 3 次。事实上,我希望节点 /RL0201x/ 的每个孙子节点都发生一次

正如您所看到的,我对法语字符的编码有疑问。这是我想要的结果。

<?xml version="1.0" encoding="iso-8859-1"?>
<root>
  <RLUEx xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <RL0101Ax>7</RL0101Ax>
    <RL0101Ex>CH</RL0101Ex>
    <RL0101Gx>PARC ÉOLIEN</RL0101Gx>
    <RL0105A>4812</RL0105A>
    <RL0201Ax>PARC ÉOLIEN NICOLAS-RIOU COMMANDITÉ INC.</RL0201Ax> <RL0201Cx>1010 DE LA GAUCHETIÈRE OUEST, 20E ÉTAGE</RL0201Cx>   <RL0201Dx>MONTREAL (QUÉBEC)</RL0201Dx>
    <RL0201Ex>H3B2N2</RL0201Ex>
    <RL0201Gx>2016-08-08</RL0201Gx>
    <RL0201U>9</RL0201U>
    <RL0603A>M.R.C. LES BASQUES</RL0603A>
  </RLUEx>
  <RLUEx xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <RL0101Ax>8</RL0101Ax>
    <RL0101Ex>CH</RL0101Ex>
    <RL0101Gx>PARC ÉOLIEN</RL0101Gx>
    <RL0105A>4812</RL0105A>
    <RL0201Ax>PARC ÉOLIEN NICOLAS-RIOU COMMANDITÉ INC.</RL0201Ax>
    <RL0201Cx>1010 DE LA GAUCHETIÈRE OUEST, 20E ÉTAGE</RL0201Cx>
    <RL0201Dx>MONTREAL (QUÉBEC)</RL0201Dx>
    <RL0201Ex>H3B2N2</RL0201Ex>
    <RL0201Gx>2016-08-08</RL0201Gx>
    <RL0201U>9</RL0201U>
    <RL0603A>M.R.C. LES BASQUES</RL0603A>
  </RLUEx>

  <RLUEx xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <RL0101Ax>8</RL0101Ax>
    <RL0101Ex>CH</RL0101Ex>
    <RL0101Gx>PARC ÉOLIEN</RL0101Gx>
    <RL0105A>4812</RL0105A>
    <RL0201Ax>FORESTERIE H.B. INC.</RL0201Ax>
    <RL0201Cx>263, RUE J.J. BÉLANGER</RL0201Cx>
    <RL0201Dx>RIVIÈRE-DU-LOUP (QUÉBEC)</RL0201Dx>
    <RL0201Ex>G5R5V9</RL0201Ex>
    <RL0201Gx>2010-10-26</RL0201Gx>
    <RL0201U>9</RL0201U>
    <RL0603A>M.R.C. LES BASQUES</RL0603A>
  </RLUEx>
</root>

这是输入 xml 的更新示例:

<?xml version="1.0" encoding="ISO-8859-1"?>                                                                                                                                                                                                                                                                                                                              

<RL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="RL.xsd">
  <VERSION>2.3</VERSION>
  <RLM01A>NR110</RLM01A>
  <RLM02A>2019</RLM02A>
  <RLUEx>
    <RL0101>
      <RL0101x>
        <RL0101Ax>7</RL0101Ax>
        <RL0101Ex>CH</RL0101Ex>
        <RL0101Fx>N</RL0101Fx>
        <RL0101Gx>PARC ÉOLIEN</RL0101Gx>
      </RL0101x>
      <RL0103>
        <RL0103x>
          <RL0103Ax>5955498</RL0103Ax>
         </RL0103x>
      </RL0103>
    </RL0101>
    <RL0104>
      <RL0104A>2228</RL0104A>
      <RL0104B>75</RL0104B>
      <RL0104C>6417</RL0104C>
    </RL0104>
    <RL0105A>4812</RL0105A>
    <RL0106A>110015</RL0106A>
    <RL0107A>1100</RL0107A>
    <RL0201>
      <RL0201x>
        <RL0201Ax>PARC ÉOLIEN NICOLAS-RIOU COMMANDITÉ INC.</RL0201Ax>
        <RL0201Cx>1010 DE LA GAUCHETIÈRE OUEST, 20E ÉTAGE</RL0201Cx>
        <RL0201Dx>MONTREAL (QUÉBEC)</RL0201Dx>
        <RL0201Ex>H3B2N2</RL0201Ex>
        <RL0201Fx>BUR. 2000 DÉVELOPPEMENT EDF RENOUVELABLES INC.</RL0201Fx>
        <RL0201Gx>2016-08-08</RL0201Gx>
        <RL0201Hx>2</RL0201Hx>
      </RL0201x>
      <RL0201U>9</RL0201U>
    </RL0201>
    <RL0303A>0</RL0303A>
    <RL0401A>2014-07-01</RL0401A>
    <RL0402A>6000</RL0402A>
    <RL0404A>6000</RL0404A>
    <RL0405A>6000</RL0405A>
    <RL0501A>0</RL0501A>
    <RL0504>
      <RL0504x>
        <RL0504Ax>F-2.1</RL0504Ax>
        <RL0504Bx>204</RL0504Bx>
        <RL0504Cx>7</RL0504Cx>
        <RL0504Dx>6000</RL0504Dx>
        <RL0504Ex>T</RL0504Ex>
        <RL0504Fx>2</RL0504Fx>
      </RL0504x>
      <RL0504x>
        <RL0504Dx>6000</RL0504Dx>
        <RL0504Ex>I</RL0504Ex>
        <RL0504Fx>2</RL0504Fx>
      </RL0504x>
    </RL0504>
  </RLUEx>
  <RLUEx>
    <RL0101>
      <RL0101x>
        <RL0101Ax>8</RL0101Ax>
        <RL0101Ex>CH</RL0101Ex>
        <RL0101Fx>N</RL0101Fx>
        <RL0101Gx>PARC ÉOLIEN</RL0101Gx>
      </RL0101x>
    </RL0101>
    <RL0103>
      <RL0103x>
        <RL0103Ax>5492043</RL0103Ax>
      </RL0103x>
      <RL0103x>
        <RL0103Ax>5492047</RL0103Ax>
      </RL0103x>
    </RL0103>
    <RL0104>
      <RL0104A>2230</RL0104A>
      <RL0104B>78</RL0104B>
      <RL0104C>8650</RL0104C>
    </RL0104>
    <RL0105A>4812</RL0105A>
    <RL0106A>110016</RL0106A>
    <RL0107A>1100</RL0107A>
    <RL0201>
      <RL0201x>
        <RL0201Ax>PARC ÉOLIEN NICOLAS-RIOU COMMANDITÉ INC.</RL0201Ax>
        <RL0201Cx>1010 DE LA GAUCHETIÈRE OUEST, 20E ÉTAGE</RL0201Cx>
        <RL0201Dx>MONTREAL (QUÉBEC)</RL0201Dx>
        <RL0201Ex>H3B2N2</RL0201Ex>
        <RL0201Fx>BUR. 2000 DÉVELOPPEMENT EDF RENOUVELABLES INC.</RL0201Fx>
        <RL0201Gx>2016-08-08</RL0201Gx>
        <RL0201Hx>2</RL0201Hx>
      </RL0201x>
        <RL0201x>
        <RL0201Ax>FORESTERIE H.B. INC.</RL0201Ax>
        <RL0201Cx>263, RUE J.J. BÉLANGER</RL0201Cx>
        <RL0201Dx>RIVIÈRE-DU-LOUP (QUÉBEC)</RL0201Dx>
        <RL0201Ex>G5R5V9</RL0201Ex>
        <RL0201Fx>BÉRUBÉ HUGO A/S</RL0201Fx>
        <RL0201Gx>2010-10-26</RL0201Gx>
        <RL0201Hx>2</RL0201Hx>
      </RL0201x>
      <RL0201U>9</RL0201U>
    </RL0201>
    <RL0303A>0</RL0303A>
    <RL0401A>2014-07-01</RL0401A>
    <RL0402A>6000</RL0402A>
    <RL0404A>6000</RL0404A>
    <RL0405A>6000</RL0405A>
    <RL0501A>0</RL0501A>
    <RL0504>
      <RL0504x>
        <RL0504Ax>F-2.1</RL0504Ax>
        <RL0504Bx>204</RL0504Bx>
        <RL0504Cx>7</RL0504Cx>
        <RL0504Dx>6000</RL0504Dx>
        <RL0504Ex>T</RL0504Ex>
        <RL0504Fx>2</RL0504Fx>
      </RL0504x>
      <RL0504x>
        <RL0504Dx>6000</RL0504Dx>
        <RL0504Ex>I</RL0504Ex>
        <RL0504Fx>2</RL0504Fx>
      </RL0504x>
    </RL0504>
  </RLUEx>
  <RL0603A>M.R.C. LES BASQUES</RL0603A>
  </RL>
马丁·霍南

也许首先选择要映射到结果元素的特定元素,然后向上选择祖先并复制/选择要插入的内容:

<?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:strip-space elements="*"/>
  
  <xsl:template match="/RL" priority="5">
      <root>
          <xsl:apply-templates select="RLUEx/RL0201/RL0201x" mode="blue"/>
      </root>
  </xsl:template>
  
  <xsl:template match="RL0201x" mode="blue">
      <xsl:apply-templates select="ancestor::RLUEx">
          <xsl:with-param name="instance" select="."/>
      </xsl:apply-templates>
  </xsl:template>
  
  <xsl:template match="RLUEx" priority="5">
      <xsl:param name="instance"/>
      <xsl:copy>
                <xsl:copy-of select="RL0101/RL0101x/RL0101Ax"/>
                <xsl:copy-of select="RL0101/RL0101x/RL0101Ex"/>
                <xsl:copy-of select="RL0101/RL0101x/RL0101Gx"/>
                <xsl:copy-of select="RL0103/RL0103x/RL0103Ax"/>
                <xsl:copy-of select="RL0105A"/>
                <xsl:copy-of select="RL0201/RL0201x[generate-id() = generate-id($instance)]/RL0201Ax"/>
                <xsl:copy-of select="RL0201/RL0201x[generate-id() = generate-id($instance)]/RL0201Cx"/>
                <xsl:copy-of select="RL0201/RL0201x[generate-id() = generate-id($instance)]/RL0201Dx"/>
                <xsl:copy-of select="RL0201/RL0201x[generate-id() = generate-id($instance)]/RL0201Ex"/>
                <xsl:copy-of select="RL0201/RL0201x[generate-id() = generate-id($instance)]/RL0201Gx"/>
                <xsl:copy-of select="RL0201/RL0201U"/>
                <xsl:copy-of select="RL0306/RL0306A"/>
                <xsl:copy-of select="RL0307/RL0307A"/>
                <xsl:copy-of select="RL0307/RL0307B"/>
                <xsl:copy-of select="RL0308/RL0308A"/>
                <xsl:copy-of select="RL0309/RL0309A"/>
                <xsl:copy-of select="RL0310/RL0310A"/>
                <xsl:copy-of select="RL0311/RL0311A"/>
                <xsl:copy-of select="RL0312/RL0312A"/>
                <xsl:copy-of select="RL0313/RL0313A"/>
                <xsl:copy-of select="../RL0603A"/>
      </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

或者也许对代码进行了一些消毒:

<?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:strip-space elements="*"/>
  
  <xsl:template match="/RL">
      <root>
          <xsl:apply-templates select="RLUEx/RL0201/RL0201x" mode="blue"/>
      </root>
  </xsl:template>
  
  <xsl:template match="RL0201x" mode="blue">
      <xsl:apply-templates select="ancestor::RLUEx">
          <xsl:with-param name="instance" select="."/>
      </xsl:apply-templates>
  </xsl:template>
  
  <xsl:template match="RLUEx">
      <xsl:param name="instance"/>
      <xsl:copy>
          <xsl:apply-templates
            select="RL0101/RL0101x |
                    RL0103/RL0103x/RL0103Ax |
                    RL0105A | 
                    RL0201/RL0201x[generate-id() = generate-id($instance)] |
                    RL0201/RL0201U |
                    RL0306/RL0306A |
                    RL0307/RL0307A |
                    RL0307/RL0307B |
                    RL0309/RL0309A |
                    RL0310/RL0310A |
                    RL0311/RL0311A |
                    RL0312/RL0312A |
                    RL0313/RL0313A |
                    ../RL0603A |
                    RL0103/RL0103x/RL0103Ax
                    "/>
      </xsl:copy>
  </xsl:template>
  
  <xsl:template match="RL0101x">
      <xsl:copy-of
        select="RL0101Ax | RL0101Ex | RL0101Gx"/>
  </xsl:template>
  
  <xsl:template match="RL0201x">
      <xsl:copy-of 
        select="RL0201Cx | RL0201Dx | RL0201Ex | RL0201Gx"/>
  </xsl:template>
  
  <xsl:template match="*[not(*)]">
      <xsl:copy-of select="."/>
  </xsl:template>

</xsl:stylesheet>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章