我试图在 XSLT 中获取自定义生成的字符串序列的唯一值。手头的问题很不寻常,因为我必须先在 '.' 上拆分一个字符串。最后一点,这工作正常,但使用 XSLT 2.0 distinct-values 获取唯一值不是。
给定一些输入
<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 的一部分)
我还尝试使用键索引或分组方式来实现唯一性,但这些与文档片段的配合并不好。