XSLT でカスタム生成された文字列シーケンスの一意の値を取得しようとしています。最初に「.」で文字列を分割する必要があるため、目前の問題はかなり珍しいものです。最後のビットをチョップします。これは正常に機能していますが、XSLT 2.0 の個別の値を使用して一意の値を取得することはできません。
いくつかの入力が与えられた場合
<TreeNumberList>
<TreeNumber>A01.001.001</TreeNumber>
<TreeNumber>A01.001.002</TreeNumber>
<TreeNumber>A01.001.003</TreeNumber>
<TreeNumber>A01.002.111</TreeNumber>
</TreeNumberList>
望ましい出力は、反復可能なシーケンスです。
A01.001, A01.002
これまでのところ、次の機能があります
<xsl:function name="func:strip-last">
<xsl:param name="str"></xsl:param>
<xsl:value-of select="substring($str, 1, string-length($str) - 1)"></xsl:value-of>
</xsl:function>
<xsl:function name="func:parent-of">
<xsl:param name="nodes"></xsl:param>
<xsl:variable name="output">
<xsl:for-each select="$nodes">
<xsl:variable name="parent">
<xsl:for-each select="tokenize(., '\.')">
<xsl:if test="position() != last()">
<xsl:value-of select="."></xsl:value-of>
<xsl:text>.</xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:variable>
<tmp><xsl:value-of select="func:strip-last($parent))"></xsl:value-of></tmp>
</xsl:for-each>
</xsl:variable>
<xsl:sequence select="distinct-values($output/*)"></xsl:sequence>
</xsl:function>
ただし、これは個別の要素のセットを返すのではなく、関連するすべての要素のシーケンスを返します。TreeNumbers 自体は一意ではなく、キー ルックアップによって取得される名前は一意になるため、最終的なコードはもう少し不自然になります。(マークアップを認識している人にとっては、これは MeSH XML の一部です)
また、一意性のためにキー付きインデックスまたはグループ化を使用しようとしましたが、それらはドキュメントのフラグメントではうまく機能しませんでした。