我有这个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的第一个实例。
那么,如果存在这种尾部逗号,有什么办法抑制它?
答案 0 :(得分:1)
有几种方法可以解决此问题:
在您的xsl:for-each
中使用谓词(正如您刚开始想做的那样),并使用count(preceding-sibling::Name)
计算索引号。
测试是否存在following-sibling::Name[[@Highlight='true']"
来检测最后一个节点,并且在出现时不要输出逗号。
使用一个临时变量来存储突出显示的名称及其原始位置。然后处理变量。
我应该补充一点,就性能而言,选项1和2的价格更高(需要沿同级轴进行重复测试),而选项3则需要更多的编码。