首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSLT / Muenchian分组:如何从组中选择具有某些子元素的元素?

XSLT / Muenchian分组:如何从组中选择具有某些子元素的元素?
EN

Stack Overflow用户
提问于 2017-11-15 20:19:27
回答 1查看 153关注 0票数 2

我希望能够从具有某些子元素的复制组(与慕尼黑分组完成)中选择一个元素。我的XML如下所示:

代码语言:javascript
复制
<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>

我的XSLT看起来像这样:

代码语言:javascript
复制
<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>

输出现在如下所示:

代码语言:javascript
复制
SSCC1§Receiver1§
SSCC2§Receiver2§Note2
SSCC3§Receiver3§
SSCC4§Receiver4§

因此,我的XSLT现在将从分组的元素中选取第一个命中的元素,我希望得到的结果是:

代码语言:javascript
复制
SSCC1§Receiver1§Note1
SSCC2§Receiver2§Note2
SSCC3§Receiver3§Note3
SSCC4§Receiver4§

因此,XSLT应该从具有最多数据的组中找到那些重复项。不是第一个或最后一个,而是具有某些子元素的那个(或者在我的最后一个例子中:子子元素)

在这种情况下,并不是所有的元素都有子元素(这里是SSCC4),这些子元素应该与它们拥有的数据一起使用(不应该被忽略)。

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

我们非常感谢您的帮助:)

EN

回答 1

Stack Overflow用户

发布于 2017-11-15 20:24:20

您可以从key()导航,如下所示:

代码语言:javascript
复制
<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>

key('ean',sscc)将选择当前组的所有<parcel>元素,并对它们下面的所有<attention>元素执行key('ean',sscc)/attention操作。

在XSLT 2.0+中,您还可以使用<xsl:for-each-group>current-group()函数来实现相同的效果。

<xsl:value-of>中使用key('ean',sscc)/attention只会打印第一个匹配项的值,这似乎就是您的意图。

没有必要像您那样显式地使用current()current()旨在用于XPath谓词中,在普通的select表达式中,它不会添加任何值。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47307243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档