XSLT 1.0 Group by / distinct xml 节点值
XSLT 1.0 Group by / distinct xml nodes value
我有一个包含节点列表 MOVIMENTO 的 XML 文件,我需要根据子标签 SIGLA 的值对这些节点进行分组 使用 XSLT 1.0。
<RESULT>
<MOVIMENTO> <!-- MOVIMENTO: nodes to cicle into -->
<INFO>
<MOV_AREA>10</MOV_AREA>
</INFO>
<ARTICOLI>
<ARTICOLO>
<SIGLA>80069</SIGLA> <!-- SIGLA: nodes to group by distinct value -->
<UM>NR</UM>
<QTA_CONS>1,00</QTA_CONS>
</ARTICOLO>
</ARTICOLI>
</MOVIMENTO>
<MOVIMENTO>
<INFO>
<MOV_AREA>13</MOV_AREA>
</INFO>
<ARTICOLI>
<ARTICOLO>
<SIGLA>80069</SIGLA>
<UM>NR</UM>
<QTA_CONS>1,00</QTA_CONS>
</ARTICOLO>
</ARTICOLI>
</MOVIMENTO>
<MOVIMENTO>
<INFO>
<MOV_AREA>14</MOV_AREA>
</INFO>
<ARTICOLI>
<ARTICOLO>
<SIGLA>77586</SIGLA>
<UM>NR</UM>
<QTA_CONS>1,00</QTA_CONS>
</ARTICOLO>
</ARTICOLI>
</MOVIMENTO>
</RESULT>
我根据在网上找到的示例尝试了很多解决方案,但没有一个适合我。
有人可以帮助我吗?
在我使用的代码下方:
<?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:key name="groups" match="ARTICOLO" use="SIGLA" />
<xsl:template match="RESULT">
<xsl:apply-templates select="MOVIMENTO/ARTICOLI/ARTICOLO[generate-id() = generate-id(key('groups', SIGLA)[1])]"/>
</xsl:template>
<xsl:template match="ARTICOLO">
<xsl:for-each select="key('groups', SIGLA)">
SIGLA: <xsl:value-of select="normalize-space(SIGLA)"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
需要对 XSLT 代码进行一些调整。密钥需要更改为
<xsl:key name="groups" match="MOVIMENTO" use="ARTICOLI/ARTICOLO/SIGLA" />
您可以使用 identity transform
模板将元素原样复制到输出,然后应用分组。
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
匹配分组元素的 <MOVIMENTO>
模板,然后遍历不同元素的键。
<xsl:template match="MOVIMENTO[generate-id() = generate-id(key('groups', ARTICOLI/ARTICOLO/SIGLA)[1])]">
<xsl:copy>
<xsl:for-each select="key('groups', ARTICOLI/ARTICOLO/SIGLA)">
<xsl:apply-templates select="INFO" />
</xsl:for-each>
<xsl:apply-templates select="key('groups', ARTICOLI/ARTICOLO/SIGLA)[1]/ARTICOLI" />
</xsl:copy>
</xsl:template>
最后,对于任何其他 <MOVIMENTO>
个节点,什么都不做。
<xsl:template match="MOVIMENTO" />
输出如下
<RESULT>
<MOVIMENTO>
<INFO>
<MOV_AREA>10</MOV_AREA>
</INFO>
<INFO>
<MOV_AREA>13</MOV_AREA>
</INFO>
<ARTICOLI>
<ARTICOLO>
<SIGLA>80069</SIGLA>
<UM>NR</UM>
<QTA_CONS>1,00</QTA_CONS>
</ARTICOLO>
</ARTICOLI>
</MOVIMENTO>
<MOVIMENTO>
<INFO>
<MOV_AREA>14</MOV_AREA>
</INFO>
<ARTICOLI>
<ARTICOLO>
<SIGLA>77586</SIGLA>
<UM>NR</UM>
<QTA_CONS>1,00</QTA_CONS>
</ARTICOLO>
</ARTICOLI>
</MOVIMENTO>
</RESULT>
我有一个包含节点列表 MOVIMENTO 的 XML 文件,我需要根据子标签 SIGLA 的值对这些节点进行分组 使用 XSLT 1.0。
<RESULT>
<MOVIMENTO> <!-- MOVIMENTO: nodes to cicle into -->
<INFO>
<MOV_AREA>10</MOV_AREA>
</INFO>
<ARTICOLI>
<ARTICOLO>
<SIGLA>80069</SIGLA> <!-- SIGLA: nodes to group by distinct value -->
<UM>NR</UM>
<QTA_CONS>1,00</QTA_CONS>
</ARTICOLO>
</ARTICOLI>
</MOVIMENTO>
<MOVIMENTO>
<INFO>
<MOV_AREA>13</MOV_AREA>
</INFO>
<ARTICOLI>
<ARTICOLO>
<SIGLA>80069</SIGLA>
<UM>NR</UM>
<QTA_CONS>1,00</QTA_CONS>
</ARTICOLO>
</ARTICOLI>
</MOVIMENTO>
<MOVIMENTO>
<INFO>
<MOV_AREA>14</MOV_AREA>
</INFO>
<ARTICOLI>
<ARTICOLO>
<SIGLA>77586</SIGLA>
<UM>NR</UM>
<QTA_CONS>1,00</QTA_CONS>
</ARTICOLO>
</ARTICOLI>
</MOVIMENTO>
</RESULT>
我根据在网上找到的示例尝试了很多解决方案,但没有一个适合我。 有人可以帮助我吗? 在我使用的代码下方:
<?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:key name="groups" match="ARTICOLO" use="SIGLA" />
<xsl:template match="RESULT">
<xsl:apply-templates select="MOVIMENTO/ARTICOLI/ARTICOLO[generate-id() = generate-id(key('groups', SIGLA)[1])]"/>
</xsl:template>
<xsl:template match="ARTICOLO">
<xsl:for-each select="key('groups', SIGLA)">
SIGLA: <xsl:value-of select="normalize-space(SIGLA)"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
需要对 XSLT 代码进行一些调整。密钥需要更改为
<xsl:key name="groups" match="MOVIMENTO" use="ARTICOLI/ARTICOLO/SIGLA" />
您可以使用 identity transform
模板将元素原样复制到输出,然后应用分组。
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
匹配分组元素的 <MOVIMENTO>
模板,然后遍历不同元素的键。
<xsl:template match="MOVIMENTO[generate-id() = generate-id(key('groups', ARTICOLI/ARTICOLO/SIGLA)[1])]">
<xsl:copy>
<xsl:for-each select="key('groups', ARTICOLI/ARTICOLO/SIGLA)">
<xsl:apply-templates select="INFO" />
</xsl:for-each>
<xsl:apply-templates select="key('groups', ARTICOLI/ARTICOLO/SIGLA)[1]/ARTICOLI" />
</xsl:copy>
</xsl:template>
最后,对于任何其他 <MOVIMENTO>
个节点,什么都不做。
<xsl:template match="MOVIMENTO" />
输出如下
<RESULT>
<MOVIMENTO>
<INFO>
<MOV_AREA>10</MOV_AREA>
</INFO>
<INFO>
<MOV_AREA>13</MOV_AREA>
</INFO>
<ARTICOLI>
<ARTICOLO>
<SIGLA>80069</SIGLA>
<UM>NR</UM>
<QTA_CONS>1,00</QTA_CONS>
</ARTICOLO>
</ARTICOLI>
</MOVIMENTO>
<MOVIMENTO>
<INFO>
<MOV_AREA>14</MOV_AREA>
</INFO>
<ARTICOLI>
<ARTICOLO>
<SIGLA>77586</SIGLA>
<UM>NR</UM>
<QTA_CONS>1,00</QTA_CONS>
</ARTICOLO>
</ARTICOLI>
</MOVIMENTO>
</RESULT>