Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用XSLT从XML中获取不同的值_Xml_Xslt_Xslt 1.0 - Fatal编程技术网

使用XSLT从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

我的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>

每个循环都有一个循环

<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并使用上述编码