首页 > 解决方案 > 如何使用 xslt 中的每个组

问题描述

我想通过使用“for each group”删除我的 xml 中的重复值(条形码)

这是我的xml

<?xml version='1.0' encoding='UTF-8'?>
<multimap:Messages xmlns:multimap="http://sap.com/xi/XI/SplitAndMerge">
    <multimap:Message1>
        <bookRoot>
            <bookRecord>
                <barcode>1111</barcode>
                <modifiedDate>2019-04-04T05:11:59.000Z</modifiedDate>
            </bookRecord>
            <bookRecord>
                <barcode>2222</barcode>
                <modifiedDate>2019-11-07T15:00:23.000Z</modifiedDate>
            </bookRecord>
            <bookRecord>
                <barcode>1111</barcode>
                <modifiedDate>2020-01-11T05:51:23.000Z</modifiedDate>
            </bookRecord>
        </bookRoot>
        <bookRoot>
            <bookRecord>
                <barcode>1111</barcode>
                <modifiedDate>2019-09-15T15:16:09.000Z</modifiedDate>
            </bookRecord>
            <bookRecord>
                <barcode>9999</barcode>
                <modifiedDate>2019-12-31T10:00:23.000Z</modifiedDate>
            </bookRecord>
        </bookRoot>
    </multimap:Message1>
</multimap:Messages>

这是我预期的 xml

<?xml version="1.0" encoding="UTF-8"?>
<storeRoot>
   <storeRecord>1111</storeRecord>
   <storeRecord>2222</storeRecord>
   <storeRecord>9999</storeRecord>
</storeRoot>

我尝试按条形码对每个组使用

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="bookRoot">
    <storeRoot>
        <xsl:for-each-group select="bookRecord" group-by="barcode">
            <xsl:sort select='barcode' order="ascending"  data-type="number"/>
            <storeRecord>
                <xsl:apply-templates select="barcode"/>
            </storeRecord>
        </xsl:for-each-group>
    </storeRoot>
</xsl:template>
</xsl:stylesheet>

这是我的实际结果。

<?xml version="1.0" encoding="UTF-8"?>
<storeRoot>
   <storeRecord>1111</storeRecord>
   <storeRecord>2222</storeRecord>
</storeRoot>
<storeRoot>
   <storeRecord>1111</storeRecord>
   <storeRecord>9999</storeRecord>
</storeRoot>

我仍然得到重复记录“1111”。如何删除重复的条形码记录?

标签: xmlxsltxslt-1.0xslt-2.0xslt-3.0

解决方案


您的模板匹配bookRoot- 输入 XML 中有两个 bookRoot 实例。因此,您将获得 的两个实例storeRoot,每个实例都对自己的bookRoot节点子集进行分组。

请尝试:

<xsl:template match="/">
    <storeRoot>
        <xsl:for-each-group select="//bookRecord" group-by="barcode">
            <xsl:sort select='barcode' order="ascending"  data-type="number"/>
            <storeRecord>
                <xsl:apply-templates select="barcode"/>
            </storeRecord>
        </xsl:for-each-group>
    </storeRoot>
</xsl:template>

推荐阅读