XSLT 2 が推奨されており、これがより簡単になることを願っています。
に似た文書が与えられた場合
<doc xmlns:bob="bob.com">
<element bob:name="fred" bob:occupation="Dr">Stuff</element>
<element bob:name="Bill" bob:occupation="Dr" bob:birthMonth="Jan"/>
<element>Kill Me</element>
<element bob:name="fred" bob:occupation="Dr">different Stuff</element>
</doc>
bob 名前空間のすべての属性に基づいて、すべての一意の要素を持ちたいと思います。これは代表的なサンプルですが、もっと深い入れ子にするので、ツリーをトラバースしたいだけです
*[@bob:*] and get the unique set of those.
期待される出力は次のようになります
<doc xmlns:bob="bob.com">
<element bob:name="fred" bob:occupation="Dr">Stuff</element>
<element bob:name="Bill" bob:occupation="Dr" bob:birthMonth="Jan"/>
</doc>
1 つの要素は @bob:* 属性を持たないために削除され、もう 1 つの要素は属性のみに基づいて最初の要素の複製であるために削除されました。
キーを使用しようとしましたが、正しく機能していないようです
<xsl:key name="BobAttributes" match="//*" use="./@bob:*" />
また、すべての @bob 属性を連結する関数を作成しようとしましたが、それも期待どおりに機能しないようでした。
<xsl:key name="BobAttributes" match="//*" use="functx:AllBobConcat(.)" />
<xsl:function name="functx:AllBobConcat" as="xs:string*"
xmlns:functx="http://www.functx.com" >
<xsl:param name="nodes" as="node()*"/>
<xsl:for-each select="$nodes/@bob:*">
<xsl:value-of select="local-name(.)"/>
<xsl:value-of select="."/>
</xsl:for-each>
</xsl:function>
どちらの場合も、「単純な」XSL を使用して一意のものを除外していましたが、ここで吹き飛ばしたのでしょうか? 試してデバッグするためにここに追加された変数。
<xsl:template match="*[@ism:*]" priority="100">
<xsl:variable name="concat">
<xsl:value-of select="functx:AllBobConcat(.)"/>
</xsl:variable>
<xsl:variable name="myID">
<xsl:value-of select="generate-id() "/>
</xsl:variable>
<xsl:variable name="Keylookup">
<xsl:value-of select="key('BobAttributes', $concat)"/>
</xsl:variable>
<xsl:value-of select="concat($concat, $Keylookup, $myID)"/>
<xsl:if test="generate-id() = generate-id(key('BobAttributes', $concat)[1])">
<xsl:apply-templates select="." mode="copy"/>
</xsl:if>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()" mode="copy">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
私が見落としていた単純なことや、私が取るべきだったまったく異なるクールなアプローチを聞くのを楽しみにしています.