我被问到是否有办法根据命名节点的索引匹配给定节点?这是一个例子:
<RecordSets>
<RecordSet RecordSetId="Events">
<Columns>
<Col Name="a" Type="Free" />
<Col Name="b" Type="Free" />
<Col Name="c" Type="Free" />
<Col Name="d" Type="Free" />
<Col Name="e" Type="Free" />
</Columns>
<Rows>
<Row>
<Col>1</Col>
<Col>2</Col>
<Col>3</Col>
<Col>4</Col>
<Col>5</Col>
</Row>
<Row>
<Col/>
<Col/>
<Col/>
<Col/>
<Col />
</Row>
</Rows>
</RecordSet>
</RecordSets>
所以在这种情况下,我希望能够选择说<Col Name="e" Type="Free" />
的索引并使用该索引将模板与<Col>5</Col>
匹配
我真的很难实现这一目标。到目前为止,我设法得到的最好的是:
<xsl:template match="Col[position() = last()" mode="RSLCell">
根据我的简化示例,哪个“有效”,但需要选择的位置并不总是最后一个。任何想法都非常感激。谢谢!
编辑一些澄清:我有一个模板,格式如下。由于业务限制,我只能真正修改模板的内部。我们正在使用XSLT v1。
<xsl:template match="Col[position() = last()]">
<!-- This will be a serialized CaseEventAction collection, get a new document and match the events-->
<xsl:variable name="document" select="extensions:XmlDataItemValueAsNodeSet(text())"/>
<td>
<xsl:apply-templates select="$document/applyAnotherTemplate" />
</td>
正如您所看到的,这仅仅取决于所讨论的项目位于last()位置。现在不再是这种情况,我们现在需要在<col>
代码中将<col Name="e"... />
代码与相同的数字/索引进行匹配。
答案 0 :(得分:0)
您当然可以使用<xsl:template match="Row/Col[position() = count(/RecordsSets/RecordSet[@RecordSetId = 'Events']/Columns/Col[@Name = 'e']/preceding-sibling::Col) + 1]"/>
形式的位置谓词。