XSLT/Muenchian分组:如何从组中选择具有特定子元素的元素?

XSLT/Muenchian分组:如何从组中选择具有特定子元素的元素?,xslt,muenchian-grouping,Xslt,Muenchian Grouping,我希望能够选择一个元素,从一组重复完成的Muenchian分组有一定的子元素。我的XML如下所示: <waybill> <shipment> <parcel> <sscc>SSCC1</sscc> <consignee>Receiver1</consignee> <date>Date1</date> <statu

我希望能够选择一个元素,从一组重复完成的Muenchian分组有一定的子元素。我的XML如下所示:

<waybill>
<shipment>
    <parcel>
        <sscc>SSCC1</sscc>
        <consignee>Receiver1</consignee>
        <date>Date1</date>
        <status>Status1</status>
    </parcel>
    <parcel>
        <sscc>SSCC2</sscc>
        <consignee>Receiver2</consignee>
        <attention>Note2</attention>
    </parcel>
    <parcel>
        <sscc>SSCC3</sscc>
        <consignee>Receiver3</consignee>
    </parcel>
    <parcel>
        <sscc>SSCC4</sscc>
        <consignee>Receiver4</consignee>
    </parcel>
    <parcel>
        <sscc>SSCC1</sscc>
        <consignee>Receiver1</consignee>
        <attention>Note1</attention>
        <date>Date2</date>
        <status>Status2</status>
    </parcel>
    <parcel>
        <sscc>SSCC3</sscc>
        <consignee>Receiver3</consignee>
        <attention>Note3</attention>
    </parcel>
</shipment>
</waybill>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" version="2.0">
<xsl:output method="text" version="1.0" encoding="ISO-8859-1" indent="yes"/>
<xsl:key name="ean" match="parcel" use="sscc"/>
<xsl:template match="/">
    <xsl:for-each select="/waybill/shipment/parcel[generate-id()=generate-id(key('ean',sscc))]">
        <xsl:value-of select="current()/sscc"/>
        <xsl:text>§</xsl:text>
        <xsl:value-of select="current()/consignee"/>
        <xsl:text>§</xsl:text>
        <xsl:value-of select="current()/attention"/>
        <xsl:text>&#xd;</xsl:text>
    </xsl:for-each>
</xsl:template>
</xsl:stylesheet>
SSCC1§Receiver1§
SSCC2§Receiver2§Note2
SSCC3§Receiver3§
SSCC4§Receiver4§
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" version="2.0">
    <xsl:output method="text" version="1.0" encoding="ISO-8859-1" indent="yes"/>
    <xsl:key name="ean" match="parcel" use="sscc"/>

    <xsl:template match="/">
        <xsl:for-each select="/waybill/shipment/parcel[generate-id()=generate-id(key('ean',sscc))]">
            <xsl:variable name="group" select="key('ean',sscc)" />
            <xsl:value-of select="sscc"/>
            <xsl:text>§</xsl:text>
            <xsl:value-of select="$group/consignee"/>
            <xsl:text>§</xsl:text>
            <xsl:value-of select="$group/attention"/>
            <xsl:text>&#xd;</xsl:text>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>
因此,我的XSLT现在将从分组的元素中选择第一个命中项,我希望得到的结果是:

SSCC1§Receiver1§Note1
SSCC2§Receiver2§Note2
SSCC3§Receiver3§Note3
SSCC4§Receiver4§
所以XSLT应该从拥有最多数据的组中找到这些重复项。不是第一个或最后一个,而是有特定子元素的,或者在我的最后一个例子中:子子元素

在这种情况下,并非所有元素都有子元素SSCC4,这些子元素应与它们拥有的数据一起使用,不应忽略

从分组的相似元素中找到最佳元素的正确方法是什么

非常感谢您的帮助:

您可以通过按键导航,如下所示:

<waybill>
<shipment>
    <parcel>
        <sscc>SSCC1</sscc>
        <consignee>Receiver1</consignee>
        <date>Date1</date>
        <status>Status1</status>
    </parcel>
    <parcel>
        <sscc>SSCC2</sscc>
        <consignee>Receiver2</consignee>
        <attention>Note2</attention>
    </parcel>
    <parcel>
        <sscc>SSCC3</sscc>
        <consignee>Receiver3</consignee>
    </parcel>
    <parcel>
        <sscc>SSCC4</sscc>
        <consignee>Receiver4</consignee>
    </parcel>
    <parcel>
        <sscc>SSCC1</sscc>
        <consignee>Receiver1</consignee>
        <attention>Note1</attention>
        <date>Date2</date>
        <status>Status2</status>
    </parcel>
    <parcel>
        <sscc>SSCC3</sscc>
        <consignee>Receiver3</consignee>
        <attention>Note3</attention>
    </parcel>
</shipment>
</waybill>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" version="2.0">
<xsl:output method="text" version="1.0" encoding="ISO-8859-1" indent="yes"/>
<xsl:key name="ean" match="parcel" use="sscc"/>
<xsl:template match="/">
    <xsl:for-each select="/waybill/shipment/parcel[generate-id()=generate-id(key('ean',sscc))]">
        <xsl:value-of select="current()/sscc"/>
        <xsl:text>§</xsl:text>
        <xsl:value-of select="current()/consignee"/>
        <xsl:text>§</xsl:text>
        <xsl:value-of select="current()/attention"/>
        <xsl:text>&#xd;</xsl:text>
    </xsl:for-each>
</xsl:template>
</xsl:stylesheet>
SSCC1§Receiver1§
SSCC2§Receiver2§Note2
SSCC3§Receiver3§
SSCC4§Receiver4§
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" version="2.0">
    <xsl:output method="text" version="1.0" encoding="ISO-8859-1" indent="yes"/>
    <xsl:key name="ean" match="parcel" use="sscc"/>

    <xsl:template match="/">
        <xsl:for-each select="/waybill/shipment/parcel[generate-id()=generate-id(key('ean',sscc))]">
            <xsl:variable name="group" select="key('ean',sscc)" />
            <xsl:value-of select="sscc"/>
            <xsl:text>§</xsl:text>
            <xsl:value-of select="$group/consignee"/>
            <xsl:text>§</xsl:text>
            <xsl:value-of select="$group/attention"/>
            <xsl:text>&#xd;</xsl:text>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>
键“ean”,sscc将选择当前组的所有元素,键“ean”,sscc/注意它们下面的所有元素

在XSLT2.0+中,还可以使用和当前组函数来实现相同的效果

使用“ean”键,a中的sscc/attention只会打印第一个匹配的值,这似乎就是您的意图

像您那样显式地使用current并不是真正必要的。current用于XPath谓词内部,在普通的select表达式中,它不添加任何值。

Hello。我在上面的原始xml中添加了sscc1下的和元素。我还需要输出日期和状态,但这里只有最后一个条目Date2/Status2。我知道[最后一个]应该完成这个技巧,但是我应该如何在选择使用键中使用它呢?Hos我可以使用?$group/date[last]键选择分组SSCC1的最后一个元素吗