xml - 使用 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>
推荐阅读
- html - Chromium(brave) 浏览器上的 CSS 模糊效果不同
- c# - 找出矩阵中水平/垂直对齐的标记
- android - 避免使用不同的密钥库/证书签署 apk
- javascript - HTML JavaScript 从文件打印到页面
- javascript - “export”被转换为“export default”,防止导入
- javascript - 在 Node.js 中使用事件发射器进行垃圾收集
- javascript - 即使字段为空且不遵循模式,提交按钮也会调用 javascript 函数
- ubuntu - 在仅主机网络上使用 E_ACCESSDENIED 的 VirtualBox 提供程序失败
- asp.net-core - ASP.NET Core 5.0 nlog 实现不起作用
- javascript - React Hooks useState 数组存储问题