xml - XSLT如何使用另一个节点的索引匹配节点

时间:2015-12-17 10:41:05

标签: xml xslt

我被问到是否有办法根据命名节点的索引匹配给定节点?这是一个例子:

<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"... />代码与相同的数字/索引进行匹配。

1 个答案:

答案 0 :(得分:0)

您当然可以使用<xsl:template match="Row/Col[position() = count(/RecordsSets/RecordSet[@RecordSetId = 'Events']/Columns/Col[@Name = 'e']/preceding-sibling::Col) + 1]"/>形式的位置谓词。