循环访问xsl:key,输出结果,添加分隔符 - 但跳过一些结果

时间:2018-01-08 18:14:09

标签: xslt xpath

我使用的是基于文本的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,

...无意中添加了最后一个逗号。

当跳过/拒绝最后一个节点时,如何避免最终逗号的这个问题?

提前致谢。

1 个答案:

答案 0 :(得分:1)

当您使用XSLT 2或3时,您应该只使用<xsl:value-of select="(key('getcommonseg', @master-id) except .)/@id" separator=", "/>,而不是“骑自行车”。