3

这是我的 XML:

...
<table></table>
<p class="source"></p>
<p class="notes"></p>
<p class="notes"></p>
<p class="notes"></p>
<p />
<p />
...
<table></table>
<p class="notes"></p>
<p class="notes"></p>
<p />
...

我正在尝试编写一个为每个"<p>"标签调用的模板。这个模板将返回这个标签相对于它的第一个前面的标签所在的位置的索引"<table>"。它应该只计算"<p>"属性“class”等于“notes”的标签。

因此,对于上面的示例,我希望在下面的评论中注明索引:

...
<table></table>
<p class="source"></p>
// should return 0 <p class="notes"></p>
// should return 1 <p class="notes"></p>
// should return 2 <p class="notes"></p>
<p />
<p />
...
<table></table>
// should return 0 <p class="notes"></p>
// should return 1 <p class="notes"></p>
<p />
...

到目前为止,这是我想出的:

 <xsl:template name="PrintTableNumberedNote">
 <xsl:variable name="currentPosition" select="count(preceding-sibling::p[(@class='notes')])"/>
 <xsl:value-of select="$currentPosition"/>.     
 </xsl:template>

我需要添加逻辑以使计数在上表第一次出现时停止,因为这是使用此模板的结果不正确的样子:

...
<table></table>
<p class="source"></p>
// returns 0 <p class="notes"></p>
// returns 1 <p class="notes"></p>
// returns 2 <p class="notes"></p>
<p />
<p />
...
<table></table>
// returns 3 <p class="notes"></p>
// returns 4 <p class="notes"></p>
<p />
...

如何将其他条件与我的 XPath 语句结合起来?

谢谢,

4

1 回答 1

2

一个简单的解决方案是减去p前面的元素table

<xsl:variable name="currentPosition" select="
    count(preceding-sibling::p[@class='notes']) -
    count(preceding-sibling::table/preceding-sibling::p[@class='notes']"/>

如果您希望节点集包含前一个节点和当前节点p之间的所有元素,您可以尝试:table

<xsl:variable name="numTables" select="count(preceding-sibling::table)"/>
<xsl:variable name="paragraphs" select="
    preceding-sibling::p[
        @class='notes' and
        count(preceding-sibling::table) = $numTables]"/>

或者,使用上面的变量$currentPosition

<xsl:variable name="paragraphs" select="preceding-sibling::p
    [@class='notes']
    [position() &lt;= $currentPosition]"/>

另请参阅此类似问题

于 2013-06-03T20:54:57.590 回答