[英]How do I group XML nodes by attribute value as key using XSLT 1.0?
我是 XSLT 的新手。 这是我的 XML -
<ROWS>
<ROW>
<COLUMN NAME="ID"><![CDATA[111]]></COLUMN>
<COLUMN NAME="COL1"><![CDATA[john]]></COLUMN>
<COLUMN NAME="COL2"><![CDATA[]]></COLUMN>
<COLUMN NAME="COL3"><![CDATA[]]></COLUMN>
</ROW>
<ROW>
<COLUMN NAME="ID"><![CDATA[111]]></COLUMN>
<COLUMN NAME="COL1"><![CDATA[john]]></COLUMN>
<COLUMN NAME="COL2"><![CDATA[]]></COLUMN>
<COLUMN NAME="COL4"><![CDATA[xyz4]]></COLUMN>
</ROW>
<ROW>
<COLUMN NAME="ID"><![CDATA[112]]></COLUMN>
<COLUMN NAME="COL10"><![CDATA[john]]></COLUMN>
<COLUMN NAME="COL11"><![CDATA[]]></COLUMN>
<COLUMN NAME="COL14"><![CDATA[xyz14]]></COLUMN>
</ROW>
</ROWS>
我想按 ID 的属性值对节点进行分组。 所以输出看起来像这样 -
<ROWS>
<ROW>
<COLUMN NAME="ID">111</COLUMN>
<COLUMN NAME="COL1">john</COLUMN>
<COLUMN NAME="COL2"/>
<COLUMN NAME="COL3"/>
<COLUMN NAME="COL4">xyz4</COLUMN>
</ROW>
<ROW>
<COLUMN NAME="ID">112</COLUMN>
<COLUMN NAME="COL10">john</COLUMN>
<COLUMN NAME="COL11"/>
<COLUMN NAME="COL14">xyz14</COLUMN>
</ROW>
</ROWS>
我可以使用以下 XSLT 2.0 来实现它 -
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" omit-xml-declaration="yes"/>
<xsl:template match="ROWS">
<xsl:copy>
<xsl:for-each-group select="ROW" group-by="./COLUMN[@NAME='ID']">
<xsl:copy>
<xsl:for-each-group select="current-group()/*" group-by="@NAME">
<xsl:copy-of select="current-group()[1]" />
</xsl:for-each-group>
</xsl:copy>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
但是我需要在 XSLT 1.0 中编写它并且我很难让它正常工作。 任何帮助将不胜感激。
我想我明白了——
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*" />
<xsl:key name="Row-by-Key" match="/ROWS/ROW" use="COLUMN[@NAME='ID']"/>
<xsl:key name="Row-by-Key-child-by-name-value" match="ROW/*"
use="concat(../COLUMN[@NAME='ID'],'+',@NAME,'+',.)"/>
<xsl:template match="ROWS">
<ROWS>
<xsl:for-each
select="*[generate-id()=generate-id(key('Row-by-Key',COLUMN[@NAME='ID'])[1])]">
<ROW>
<xsl:for-each
select="key('Row-by-Key',COLUMN[@NAME='ID'])
/*[generate-id()
=generate-id(
key('Row-by-Key-child-by-name-value',
concat(../COLUMN[@NAME='ID'],'+',@NAME,'+',.))[1])]">
<xsl:copy-of select="self::*[node()|@*]"/>
</xsl:for-each>
</ROW>
</xsl:for-each>
</ROWS>
</xsl:template>
</xsl:stylesheet>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.