XSLT帮助获得不同的值

时间:2011-09-27 17:46:15

标签: xml xslt

我有一个XML文档(如下所示),我需要做的是获取所有唯一的Type @ID值的列表,无论它们在SizeRanges下面的位置

因此,对于本文档,我需要将10,8,6,5加入到我可以使用的内容中。每个人都可以使用。

最终,我试图将每个SizeRange显示在彼此相邻的表中,并使相同的类型在同一行上排列。但我遇到的问题是提取一个我可以循环的类型的明确列表。

XML文档:

<SizeRanges>
    <SizeRange ID="1" Name="8-18">
        <Types>
            <Type ID="10">
                <Size Name="8"  Quantity="1" />
                <Size Name="10" Quantity="2" />
                <Size Name="12" Quantity="2" />
                <Size Name="14" Quantity="3" />
                <Size Name="16" Quantity="1" />
                <Size Name="18" Quantity="1" />
            </Type>
            <Type ID="8">
                <Size Name="8"  Quantity="1" />
                <Size Name="10" Quantity="1" />
                <Size Name="12" Quantity="2" />
                <Size Name="14" Quantity="2" />
                <Size Name="16" Quantity="1" />
                <Size Name="18" Quantity="1" />
            </Type>
            <Type ID="6">
                <Size Name="8"  Quantity="1" />
                <Size Name="10" Quantity="1" />
                <Size Name="12" Quantity="1" />
                <Size Name="14" Quantity="1" />
                <Size Name="16" Quantity="1" />
                <Size Name="18" Quantity="1" />
            </Type>
            <Type ID="5">
                <Size Name="10" Quantity="1" />
                <Size Name="12" Quantity="1" />
                <Size Name="14" Quantity="1" />
                <Size Name="16" Quantity="1" />
                <Size Name="18" Quantity="1" />
            </Type>
        </Types>
    </SizeRange>
    <SizeRange ID="2" Name="S-XL">
        <Types>
            <Type ID="10">
                <Size Name="S"  Quantity="1" />
                <Size Name="M"  Quantity="3" />
                <Size Name="L"  Quantity="4" />
                <Size Name="XL" Quantity="2" />
            </Type>
            <Type ID="8">
                <Size Name="S"  Quantity="1" />
                <Size Name="M"  Quantity="2" />
                <Size Name="L"  Quantity="3" />
                <Size Name="XL" Quantity="2" />
            </Type>
            <Type ID="6">
                <Size Name="S"  Quantity="1" />
                <Size Name="M"  Quantity="2" />
                <Size Name="L"  Quantity="2" />
                <Size Name="XL" Quantity="1" />
            </Type>
            <Type ID="5">
                <Size Name="S"  Quantity="1" />
                <Size Name="M"  Quantity="1" />
                <Size Name="L"  Quantity="2" />
                <Size Name="XL" Quantity="1" />
            </Type>
        </Types>
    </SizeRange>
</SizeRanges>

2 个答案:

答案 0 :(得分:2)

试一试:

<xsl:key name="types" match="Type" use="@ID"/>
<xsl:variable name="distinctTypes" as="xs:integer*" select="distinct-values(//SizeRange/Types/Type)" />
<xsl:template match="/">
    <xsl:for-each select="$distinctTypes">
        <xsl:value-of select="." />
    </xsl:for-each>
</xsl:template>

这是另一种方式:

<xsl:key name="types" match="Type" use="@ID"/>
<xsl:template match="/">
    <xsl:for-each select="//SizeRange/Types/Type[generate-id() = generate-id(key('types', @ID)[1])]">
        <xsl:value-of select="@ID"/>
    </xsl:for-each>
</xsl:template>

答案 1 :(得分:1)

在XSLT 2.0上,你可以这样做..

distinct-values(/SizeRanges/SizeRange/Types/Type/@ID)

这会将唯一ID作为输出