要素の祖先、自己、および子孫の属性値を取得しようとしています。そして、一意の値を表示したいと思います。
これが私が試していることです。
<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>
したがって、//を使用して個々の製品を表示することはできないため、Productで祖先と子孫を使用しています。
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>
注意、あなたはXSLT 2.0にアップグレードすることができれば、あなたが使用することができますxsl:for-each-group
ので、のように
<xsl:for-each-group select=".//@value" group-by=".">
またはdistinct-values()
、そのように使用することができます
<xsl:for-each select="distinct-values(.//@value)">
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加