无法在XSLT中使用分组依据对元素值进行分组

时间:2019-05-14 11:39:35

标签: xslt-2.0

我在下面有一个XML:

 <Products>
        <Product1>
            <Reference>000510143244</Reference>
            <Value1>543</Value1>
        </Product1>
    </Products>
    <Products>
        <Product1>
            <Reference>000510143244</Reference>
            <Value1>543</Value1>
        </Product1>
    </Products>
    <Products>
        <Product1>
            <Reference>45768799322</Reference>
            <Value1>543</Value1>
        </Product1>
    </Products>
    <Products>
        <Product2>
            <Reference>35726318090</Reference>
            <Value1>543</Value1>
        </Product2>
    </Products>
    <Products>
        <Product2>
            <Reference>35726318090</Reference>
            <Value1>543</Value1>
        </Product2>
    </Products>

我只想获取Product1引用的第一个值...但我无法获取该值。也不强制要求Product 1始终是输入xml中的第一个元素。

有什么建议我该怎么做?

我试图将值设为:

<xsl:template match="//Products">
  <xsl:variable name="Product1">
    <xsl:for-each-group select="/Reference" group-by="/Reference">
        <xsl:copy-of select="." />
    </xsl:for-each-group>
  </xsl:variable>
</xsl:template>

更新:1

<?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" encoding="UTF-8" indent="yes" />

    <xsl:template match="Products[child::Product1][1]">

        <xsl:value-of select="." />

    </xsl:template>

    <xsl:template match="text()" />
</xsl:stylesheet>

我的预期输出是:000510143244

1 个答案:

答案 0 :(得分:2)

要获取具有<Products>的{​​{1}}的第一次出现,您可能需要匹配输入XML的父标记或根标记。

假设您的输入如下:

<Product1>

以下代码可以为您提供结果:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<root>
    <Products>
        <Product2>
            <Reference>35726318090</Reference>
        </Product2>
    </Products>
    <Products>
        <Product1>
            <Reference>02563899183</Reference>
        </Product1>
    </Products>
    <Products>
        <Product1>
            <Reference>000510143244</Reference>
        </Product1>
    </Products>
    <Products>
        <Product1>
            <Reference>000510143244</Reference>
        </Product1>
    </Products>
    <Products>
        <Product2>
            <Reference>35726318090</Reference>
        </Product2>
    </Products>
</root>

观看演示:https://xsltfiddle.liberty-development.net/3NJ38Zx

更新

或者您可以通过以下代码简单地实现它:

<?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" encoding="UTF-8" indent="yes" />

    <xsl:template match="root">
        <xsl:for-each-group select="Products/Product1" group-by="Reference">
            <xsl:copy-of select="current-group()[1]" />
        </xsl:for-each-group>
    </xsl:template>

</xsl:stylesheet>

更新2:

<?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" encoding="UTF-8" indent="yes" />

    <xsl:template match="Products[child::Product1][1]">
        <xsl:copy-of select="." />
    </xsl:template>

    <xsl:template match="text()" />
</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/3NJ38Zx/1

更新3:

您不能通过模板为全局变量分配值。

有两种方法可以满足您的需求。

1)如下创建一个全局变量,该变量将首先使用其子元素为 <xsl:template match="root"> <xsl:variable name="ref"> <xsl:for-each-group select="Products/Product1" group-by="Reference"> <xsl:copy-of select="current-group()[1]/Reference" /> </xsl:for-each-group> </xsl:variable> <xsl:value-of select="$ref"/> </xsl:template> 的第一个<Products>并显示为<Product1>

Reference

2)您可以按如下所示修改模板以获得结果。

<?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" encoding="UTF-8" indent="yes" />

    <xsl:variable name="ref" select="root/Products[child::Product1][1]/Product1/Reference" />

    <xsl:template match="/">
        <xsl:value-of select="$ref" />
    </xsl:template>

</xsl:stylesheet>