繁体   English   中英

如何使用 XSLT 1.0 按属性值作为键对 XML 节点进行分组?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM