Xslt 如何组合或合并已分组的节点?

Xslt 如何组合或合并已分组的节点?,xslt,grouping,Xslt,Grouping,使用XSL: <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0"> <xsl:output meth

使用XSL:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
    <xsl:output method="xml"/>
    <xsl:template match="/">
        <records>
            <record>
                <!-- Group record by bigID, for further processing -->
                <xsl:for-each-group select="records/record" group-by="bigID">
                    <xsl:sort select="bigID"/>
                    <xsl:for-each select="current-group()">
                        <!-- Create new combined record -->
                        <bigID>
                            <!-- <xsl:value-of select="."/> -->
                            <xsl:for-each select=".">
                                <xsl:value-of select="bigID"/>
                            </xsl:for-each>
                        </bigID>
                        <text>
                            <xsl:value-of select="text"/>
                        </text>
                    </xsl:for-each>
                </xsl:for-each-group>
            </record>
        </records>
    </xsl:template>
</xsl:stylesheet>

我正在努力改变:

<?xml version="1.0" encoding="UTF-8"?>
<records>
    <record>
        <bigID>123</bigID>
        <text>Contains text for 123</text>
        <bigID>456</bigID>
        <text>Some 456 text</text>
        <bigID>123</bigID>
        <text>More 123 text</text>
        <bigID>123</bigID>
        <text>Yet more 123 text</text>
    </record>
</records>

123
包含123的文本
456
大约456个文本
123
更多123文本
123
还有更多的文本
进入:


123
包含123的文本
更多123文本
还有更多的文本
456
大约456个文本
现在,我只是单独列出分组的
s。我错过了分组后的步骤,在该步骤中,我组合了分组的
节点。我怀疑我需要以某种方式使用“key”函数,但我不确定


感谢您的帮助。

以下是所需的XSLT 2.0转换:

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
    <xsl:output omit-xml-declaration="yes" indent="yes"/>

    <xsl:key name="kTextforId" match="text"
         use="preceding-sibling::bigID[1]"/>

  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="record">
   <record>
    <xsl:for-each-group select="bigID" group-by=".">
     <bigID>
       <xsl:sequence select="current-grouping-key()"/>

       <xsl:copy-of select=
       "key('kTextforId', current-grouping-key())"/>
     </bigID>
    </xsl:for-each-group>
   </record>
  </xsl:template>
</xsl:stylesheet>


在提供的XML文档上执行时,将生成所需的结果。

在XSLT 2.0中,分组不需要键

由于您只是复制组中的
文本
元素,因此可以删除每个元素的内部元素

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="xml" indent="yes" />

    <xsl:template match="/">
        <records>
            <record>
                <xsl:for-each-group select="records/record/bigID" group-by=".">
                    <xsl:sort select="." data-type="number" />
                    <bigID>
                        <xsl:value-of select="." />
                        <xsl:copy-of select="current-group()/following-sibling::text[1]" />
                    </bigID>
                </xsl:for-each-group>
            </record>
        </records>
    </xsl:template>

</xsl:stylesheet>

您的输入和输出xml格式不正确。这使得输出格式模棱两可。我以为我在寻找上面Lachlan Roche的代码给出的输出,在他的第二个示例中。然而,最终我需要的输出是由Dimitre的代码创建的。非常感谢你们两位的帮助!非常感谢。
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="xml" indent="yes" />

    <xsl:template match="/">
        <records>
            <record>
                <xsl:for-each-group select="records/record/bigID" group-by=".">
                    <xsl:sort select="." data-type="number" />
                    <bigID>
                        <xsl:value-of select="." />
                        <xsl:copy-of select="current-group()/following-sibling::text[1]" />
                    </bigID>
                </xsl:for-each-group>
            </record>
        </records>
    </xsl:template>

</xsl:stylesheet>
<xsl:for-each-group select="records/record/bigID" group-by=".">
    <xsl:sort select="." data-type="number" />
    <xsl:copy-of select="." />
    <xsl:copy-of select="current-group()/following-sibling::text[1]" />
</xsl:for-each-group>