0

我的xml是这样的

    <syddata lastUpdated="19.04.2013 12:40 ">
  <data itemnumber="ln1044-wh-36" variant1="White" variant2="Size 36" variant1group="Farver" variant2group="Størrelser" var1code="wh" var2code="36" estocklevel="0,000000000000" sortering="0"></data>
  <data itemnumber="ln1044-wh-38" variant1="White" variant2="Size 38" variant1group="Farver" variant2group="Størrelser" var1code="wh" var2code="38" estocklevel="0,000000000000" sortering="0"></data>
  <data itemnumber="ln1044-wh-40" variant1="White" variant2="Size 40" variant1group="Farver" variant2group="Størrelser" var1code="wh" var2code="40" estocklevel="0,000000000000" sortering="0"></data>
  <data itemnumber="ln1044-wh-42" variant1="White" variant2="Size 42" variant1group="Farver" variant2group="Størrelser" var1code="wh" var2code="42" estocklevel="0,000000000000" sortering="0"></data>
  <data itemnumber="ln1044-wh-44" variant1="White" variant2="Size 44" variant1group="Farver" variant2group="Størrelser" var1code="wh" var2code="44" estocklevel="0,000000000000" sortering="0"></data>
</syddata>

我有一个 for each 循环

<xsl:for-each select="$variants/syddata/data">
     <xsl:value-of select="@variant1"/>
</xsl:for-each>

这将输出5次白色。但我只想说一次。意味着我想获得不同的价值。有什么办法可以做到这一点?

4

4 回答 4

2

通过确保前面没有具有匹配属性的兄弟元素,仅data使用每个属性值的第一个元素:@variant1

<xsl:for-each select="$variants/syddata/data">
  <xsl:if test="not(preceding-sibling::data[@variant1 = current()/@variant1])">
     <xsl:value-of select="@variant1"/>
  </xsl:if>
</xsl:for-each>
于 2013-04-19T13:14:22.457 回答
1

尝试这样的事情:

    <xsl:for-each select="data">
        <xsl:variable name="variant1" select="@variant1"/>
        <xsl:if test="not(following-sibling::data[@variant1= $variant1])">
            <xsl:value-of select="@variant1"/>
        </xsl:if>
    </xsl:for-each>
于 2013-04-19T13:15:59.610 回答
1

如果您需要在 XSLT 1.0 中获取不同的值,最有效的方法之一是使用xsl:key. (孟奇人分组。)

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:key name="variant1" match="data" use="@variant1"/>

    <xsl:template match="/syddata">
        <distinct-values>
            <xsl:for-each select="data[count(.|key('variant1',@variant1)[1])=1]">
                <value><xsl:value-of select="@variant1"/></value>
            </xsl:for-each> 
        </distinct-values>
    </xsl:template>

</xsl:stylesheet>

工作示例:http: //xsltransform.net/bdxtqU

于 2015-07-16T17:31:37.840 回答
0

当在您的输入 XML 上运行以下转换时,将获得所需的输出

<?xml version='1.0'?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:for-each-group select="syddata/data" group-by="@variant1">
<xsl:value-of select="distinct-values(@variant1)"/>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
于 2013-04-19T11:46:11.250 回答