我使用的是基于文本的XML文件的xsl:key
,使用Saxon处理的XSL 3。
<xsl:key name="getcommonseg" match="seg[@master-id]" use="@master-id"/>
此密钥针对数千个看起来像这样的元素传递:
<seg id="unique_id_here" master-id="master-id_here">
@master-id
实际上是@id
之一,它们将多个<seg>
组合在一起。例如:
<seg id="1-A" master-id="1-A"/>
<seg id="1-G" master-id="1-A"/>
<seg id="2-G" master-id="2-G"/>
<seg id="10-Y" master-id="1-A"/>
<seg id="5-C"/>
<seg id="6-B" master-id="2-G"/>
<seg id="8-R"/>
<seg id="11-K" master-id="2-G"/>
<seg id="19-D" master-id="1-A"/>
<seg id="22-T" master-id="2-G"/>
[...]
当我报告任何给定的<seg>
时,我会使用<xsl:key>
查找其他相关的<seg>
。例如,如果我找到了:
<seg id="11-K" master-id="2-G"/>
我应用密钥,然后遍历返回的记录,用逗号分隔输出它们,并拒绝当前记录的记录:
<template match="seg[@commonid]">
<xsl:variable name="masterid" select="./@master-id"/>
<xsl:variable name="currentid" select="./@id"/>
<xsl:value-of select="'Seg' || ./@id || 'corresponds to the following seg id(s): ' "/>
<xsl:for-each select="key('getcommonseg',$masterid)">
<xsl:if test="./@id != $currentid">
<xsl:value-of select="./@id"/>
<xsl:if test="position() != last()">, </xsl:if>
</xsl:if>
</xsl:for-each>
</template>
输出:
Seg 11-K corresponds to the following seg id(s): 2-G, 6-B, 22-T
正如您所看到的,它不会输出值'11 -K'并适当地添加逗号。但是,如果职位是:
<seg id="22-T" master-id="2-G"/>
它会输出:
Seg 22-T corresponds to the following seg id(s): 2-G, 6-B, 11-K,
...无意中添加了最后一个逗号。
当跳过/拒绝最后一个节点时,如何避免最终逗号的这个问题?
提前致谢。
答案 0 :(得分:1)
当您使用XSLT 2或3时,您应该只使用<xsl:value-of select="(key('getcommonseg', @master-id) except .)/@id" separator=", "/>
,而不是“骑自行车”。