代码之家  ›  专栏  ›  技术社区  ›  alan samuel

所有节点的XSLT Muenchian方法

  •  0
  • alan samuel  · 技术社区  · 8 年前

    我正在尝试获取元素祖先、自身和后代的属性值。然后我想显示唯一的值。

    这就是我要做的。

    <xsl:key name="remove" match="value" use="sortedvalues" />
    
    <xsl:for-each select="ancestor-or-self::node()/@value[generate-id() = generate-id(key('remove',sortedvalues)[1])] | descendant-or-self::node()/@value[generate-id() = generate-id(key('remove',sortedvalues)[1])]">
    
                <xsl:for-each select="key('remove',sortedvalues)">
                <xsl:sort select="sortedvalues"></xsl:sort>
    
                </xsl:for-each>
    
                </xsl:for-each>
    

    这是实际的XML

    <Root>
    
         <something value = “asd” </something>
        <something value = “dsa” </something>
      <Product>
        <something value = "asd"></something>
        <something value = "dsa"></something>
        <something value = "asd"></something>
    
        <anothernode>
        <something value = "qwe"></something>
        </anothernode>
    
        <anothernode2>
        <something value = "ewq"></something>
        </anothernode2>
    
        <something value = "ewq"></something>
    
    <Product>
    
      <Product>
        <something value = "asd"></something>
        <something value = "dsa"></something>
        <something value = "asd"></something>
    
        <anothernode>
        <something value = "qwe"></something>
        </anothernode>
    
        <anothernode2>
        <something value = "ewq"></something>
        </anothernode2>
    
        <something value = "ewq"></something>
    
    <Product>
    </Root>
    

    我基本上想表演

    <Product>
        <values>asd <values>
        <values>dsa<values>
        <values>qwe<values>
        <values>ewq<values>
    <Product>
    
    
    <Product>
        <values>asd <values>
        <values>dsa<values>
        <values>qwe<values>
        <values>ewq<values>
    <Product>
    

    所以我不能用//来显示每个产品,所以我一直在使用产品的祖先和后代

    1 回复  |  直到 8 年前
        1
  •  0
  •   Tim C    8 年前

    如果你想得到独一无二的 value 属性(按产品),您必须引用密钥的产品部分

     <xsl:key name="values" match="@value" use="concat(generate-id(ancestor::Product), '|', .)" />
    

    然后,对于一个给定的产品,您可以得到这样独特的值(其中 $id 是包含产品的generate-id()值的变量)

    <xsl:for-each select=".//@value[generate-id() = generate-id(key('values', concat($id, '|', .))[1])]">
    

    试试这个XSLT

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    
      <xsl:key name="values" match="@value" use="concat(generate-id(ancestor::Product), '|', .)" />
    
      <xsl:template match="Product">
        <xsl:variable name="id" select="generate-id()" />
        <xsl:copy>
            <xsl:for-each select=".//@value[generate-id() = generate-id(key('values', concat($id, '|', .))[1])]">
                <values><xsl:value-of select="." /></values>
            </xsl:for-each>
        </xsl:copy>
      </xsl:template>
    </xsl:stylesheet>
    

    注意,如果您可以升级到XSLT2.0,那么您可以使用 xsl:for-each-group 就像这样

    <xsl:for-each-group select=".//@value" group-by=".">
    

    或者你可以用 distinct-values() 就像这样

    <xsl:for-each select="distinct-values(.//@value)">