使用xslt抑制尾随逗号

时间:2018-11-29 18:11:09

标签: xslt-1.0

我有这个XSL:

  <xsl:for-each select="Name">
    <xsl:if test="@Highlight='true'">
      <td>
        <xsl:variable name="iColumnIndex" select="position()+1" />
        <xsl:value-of select="/SRRScheduleData/Columns/Heading[$iColumnIndex]"/>
        <xsl:text>, </xsl:text>
      </td>
    </xsl:if>
  </xsl:for-each>

XML是问题很简单:

<Name Highlight="false" Conflict="false">Name 1</Name>
<Name Highlight="false" Conflict="false">Name 2</Name>
<Name Highlight="true" Conflict="false">Name 3</Name>
<Name Highlight="false" Conflict="false">Name 4</Name>
<Name Highlight="false" Conflict="false">Name 5</Name>
<Name Highlight="true" Conflict="false">Name 3</Name>

XML列如下:

<Columns>
    <Heading TextAlign="left" Width="11%">Date</Heading>
    <Heading TextAlign="left" Width="11%">Hall Attendant</Heading>
    <Heading TextAlign="left" Width="11%">Car Park</Heading>
    <Heading TextAlign="left" Width="11%">Sound</Heading>
    <Heading TextAlign="left" Width="11%">Platform</Heading>
    <Heading TextAlign="left" Width="11%">Mic Left</Heading>
    <Heading TextAlign="left" Width="11%">Mic Right</Heading>
    <Heading TextAlign="left" Width="11%">Chairman</Heading>
    <Heading TextAlign="left" Width="11%">Watchtower Reader</Heading>
</Columns>

对于输出,我希望能够获得分配:

  

分配X,分配Y

在同一行上用逗号隔开。

但是我得到的是:

  

分配X,分配Y

我知道为什么会这样。最初,我考虑使用<xsl:for-each select="Name[@Highlight='true']">,然后使用position()值,如果值为1,则输出分配,否则输出“ Assignment”。

虽然可行,但在我尝试显示作业描述时会失败。我必须使用AssignmentRow中名称对象的物理位置,以便找到正确的列标题值。如果我将过滤与for-each结合使用,我将失去那些列索引位置。

这就是为什么我决定循环所有名称,以便我拥有用于​​查找分配的正确位置值的原因。需要权衡的是,我现在不知道何时找到将Highlight设置为true的第一个实例。

那么,如果存在这种尾部逗号,有什么办法抑制它?

1 个答案:

答案 0 :(得分:1)

有几种方法可以解决此问题:

  1. 在您的xsl:for-each中使用谓词(正如您刚开始想做的那样),并使用count(preceding-sibling::Name)计算索引号。

  2. 测试是否存在following-sibling::Name[[@Highlight='true']"来检测最后一个节点,并且在出现时不要输出逗号。

  3. 使用一个临时变量来存储突出显示的名称及其原始位置。然后处理变量。


我应该补充一点,就性能而言,选项1和2的价格更高(需要沿同级轴进行重复测试),而选项3则需要更多的编码。