Xpath XSLT中的条件分组

Xpath XSLT中的条件分组,xpath,xslt-2.0,muenchian-grouping,Xpath,Xslt 2.0,Muenchian Grouping,请求您帮助使用XSLT 2转换XML 我的输入XML如下所示 <?xml version="1.0" encoding="UTF-8"?> <Workers> <Worker> <Batch_number>1234</Batch_number> <Name>David</Name> <Assignment> <

请求您帮助使用XSLT 2转换XML

我的输入XML如下所示

    <?xml version="1.0" encoding="UTF-8"?>
<Workers>
    <Worker>
        <Batch_number>1234</Batch_number>
        <Name>David</Name>
        <Assignment>
            <type>A</type>
            <name>New York</name>
        </Assignment>
    </Worker>
    <Worker>
        <Batch_number>1234</Batch_number>
        <Name>David</Name>
        <Assignment>
            <type>B</type>
            <name>Boston</name>
        </Assignment>
    </Worker>
    <Worker>
        <Batch_number>1234</Batch_number>
        <Name>David</Name>
        <Assignment>
            <type>C</type>
            <name>Chicago</name>
        </Assignment>
    </Worker>
    <Worker>
        <Batch_number>78698</Batch_number>
        <Name>Karen</Name>
        <Assignment>
            <type>C</type>
            <name>Chicago</name>
        </Assignment>
    </Worker>
</Workers>

1234
大卫
A.
纽约
1234
大卫
B
波士顿
1234
大卫
C
芝加哥
78698
凯伦
C
芝加哥
所需的输出如下所示

<?xml version="1.0" encoding="UTF-8"?>
<Worker>
    <Batch_number>1234</Batch_number>
    <Name>David</Name>
    <Assignment>
            <type>A</type>
            <name>New York</name>
        </Assignment>
    <Assignment>
            <type>B</type>
            <name>Boston</name>
        </Assignment>
    <Assignment>
            <type>C</type>
            <name>Chicago</name>
        </Assignment>
</Worker>
<Worker>
    <Batch_number>78698</Batch_number>
    <Name>Karen</Name>
    <Assignment>
            <type>C</type>
            <name>Chicago</name>
        </Assignment>
</Worker>

1234
大卫
A.
纽约
B
波士顿
C
芝加哥
78698
凯伦
C
芝加哥
转化的条件是:

如果输入文件中存在具有相同
的子节点
,则相同
的所有
分配
节点应在
之后的一个
工作节点下分组

有人能帮我写正确的代码来实现这一点吗

-谢谢
Anoop

尽管您想要的输出XML格式不好,但这里有一个XSLT-2.0解决方案可以满足您的特殊需要:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/Workers">
        <xsl:for-each-group select="Worker" group-by="Batch_number">
            <Worker>
                <Batch_number><xsl:value-of select="current-grouping-key()" /></Batch_number>
                <Name><xsl:value-of select="current()/Name" /></Name>
                <xsl:copy-of select="current-group()/Assignment" />
            </Worker>
        </xsl:for-each-group>
    </xsl:template>

</xsl:stylesheet>

其输出为:

<?xml version="1.0" encoding="UTF-8"?>
<Worker>
    <Batch_number>1234</Batch_number>
    <Name>David</Name>
    <Assignment>
        <type>A</type>
        <name>New York</name>
    </Assignment>
    <Assignment>
        <type>B</type>
        <name>Boston</name>
    </Assignment>
    <Assignment>
        <type>C</type>
        <name>Chicago</name>
    </Assignment>
</Worker>
<Worker>
    <Batch_number>78698</Batch_number>
    <Name>Karen</Name>
    <Assignment>
        <type>C</type>
        <name>Chicago</name>
    </Assignment>
</Worker>

1234
大卫
A.
纽约
B
波士顿
C
芝加哥
78698
凯伦
C
芝加哥

非常感谢zx485。我稍微修改了您的代码,添加了一个父节点,使其具有格式良好的XML。谢谢你向我指出这一点。你能解释一下什么是current-grouping-key(),current(),current(),current-group()。虽然我得到了我想要的,但我无法理解这段代码是如何工作的。任何额外的细节都会对我有所帮助。再次感谢。解释这件事超出了苏的目的。还有其他人比我做得更好。所以,@Anoop如果您在使用XSLT编写代码时,没有访问某种参考书或在线资源来解释每个指令和函数的功能,那么我会非常担心。“这就像驾驶一辆汽车而不上驾驶课一样。”迈克尔凯说。我指的是W3学校和一些在线博客和资料来学习XSLT。您能推荐一些学习材料或书籍给我学习XSLT2.0和XSLT3.0吗?