簡體   English   中英

XSLT 1.0 不同數據的多個節點匯總

[英]XSLT 1.0 summarize of multiple nodes with different data

使用 XSLT 1.0,我想為PackageTypeCode標簽內的所有唯一值創建新標簽。 新標簽的值應該是其各自出現的總和。

<?xml version="1.0" encoding="utf-8"?>
<TransportJob xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="11.1">
    <Consignment>
        <GoodsItem>
            <PackageTypeCode>PE</PackageTypeCode>
        </GoodsItem>
        <GoodsItem>
            <PackageTypeCode>PC</PackageTypeCode>
        </GoodsItem>
        <GoodsItem>
            <PackageTypeCode>PE</PackageTypeCode>
        </GoodsItem>
        <GoodsItem>
            <PackageTypeCode>PC</PackageTypeCode>
        </GoodsItem>
    </Consignment>
</TransportJob>

在示例中,我有兩個PackageTypeCodePC和兩個PackageTypeCodePE 這些應返回以下內容:

<extraGoodsData>
    <product type="PC">
        <quantity>2</quantity>
    </product>
    <product type="PE">
        <quantity>2</quantity>
    </product>
</extraGoodsData>

最好的方法似乎是使用遞增變量創建多個變量。 但是,由於這些可能無限次出現,我不想編寫 >10 個變量並手動檢查每個唯一值。

在 XSTL 2.0 中,這對於例如fn:matches來說是微不足道的。

編輯:

<test>
<xsl:for-each select="GoodsItem[count(. | key('product_by_key', PackageTypeCode)[1]) = 1]">
            <xsl:for-each select="key('product_by_key', PackageTypeCode)">
                    <xsl:sort select="PackageTypeCode" />
                        <xsl:value-of select="PackageTypeCode" />
                </xsl:for-each>
</xsl:for-each>
        </test>

這是我當前生成的代碼

<test>
        <types>PC</types>
        <types>PC</types>
        <types>PC</types>
        <types>PC</types>
        <types>PE</types>
    </test>

這是在正確的軌道上,但現在我需要以某種方式計算這些。 我不認為這是正確的方法,但我覺得我在正確的軌道上(注意我使用了一個不同的源文件,類型更多,所以這就是為什么有 5 種“類型”)

試試這種方式:

XSLT 1.0

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

<xsl:key name="item-by-pkg" match="GoodsItem" use="PackageTypeCode" />

<xsl:template match="/TransportJob">
    <extraGoodsData>
        <!-- create a group for each distinct PackageTypeCode -->
        <xsl:for-each select="Consignment/GoodsItem[count(. | key('item-by-pkg', PackageTypeCode)[1]) = 1]">
            <product type="{PackageTypeCode}">
                <quantity>
                    <!-- count current group -->
                    <xsl:value-of select="count(key('item-by-pkg', PackageTypeCode))" />
                </quantity>
            </product>
        </xsl:for-each>
    </extraGoodsData>
</xsl:template>

</xsl:stylesheet>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM