使用XSLT从XML中获取不同的值
我的xml是这样的使用XSLT从XML中获取不同的值,xml,xslt,xslt-1.0,Xml,Xslt,Xslt 1.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" sorterin
<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>
每个循环都有一个循环
<xsl:for-each select="$variants/syddata/data">
<xsl:value-of select="@variant1"/>
</xsl:for-each>
这将输出5倍的白色。但我只想把它放出去一次。意味着我想要得到不同的值。有什么方法可以实现这一点吗?当在输入XML上运行以下转换时,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>
在输入XML上运行以下转换时,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>
通过确保前面没有具有匹配属性的同级元素,将第一个
数据
元素与每个@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>
通过确保前面没有具有匹配属性的同级元素,将第一个
数据
元素与每个@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>
尝试以下方法:
<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>
尝试以下方法:
<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>
如果需要在XSLT1.0中获得不同的值,最有效的方法之一是使用
xsl:key
。()
XSLT1.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>
工作示例:如果需要在XSLT1.0中获得不同的值,最有效的方法之一是使用
xsl:key
。()
XSLT1.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>
工作示例:group by对于每个XSL都是无效的属性。这就是我得到的错误now@AKS:这是XSL 2.0版。请检查您的版本并将其应用于
,您能告诉我如何将此xsl版本应用于每个循环吗only@AKS:是否仅需要XSL 1.0版。如果可能,将您的xsl版本更改为2.0,并使用上面的codinggroup by是xsl的无效属性now@AKS:这是XSL 2.0版。请检查您的版本并将其应用于
,您能告诉我如何将此xsl版本应用于每个循环吗only@AKS:是否仅需要XSL 1.0版。如果可能,将xsl版本更改为2.0并使用上述编码