XPath - determine the element position

2019-07-20 17:25发布

I want to create an index (determine the position in the XML) for every table but the problem is that the tables are in different depth. I plan to process the XML with XSLT transformation to FO. I Any ideas how to do this?

Sample XML

<document>
    <table> ... </table>

    <section>
        <table> ... </table>

        <subsection>
            <table> ... </table>
        </subsection>
    </section>
</document>

标签: xml xslt xpath
2条回答
我命由我不由天
2楼-- · 2019-07-20 18:01

This will number your tables consecutively, starting from 1.

<xsl:template match="table">
  <table id="tbl_{count(preceding::table) + 1}">
    <!-- further processing -->
  </table>
</xsl:template>
查看更多
Explosion°爆炸
3楼-- · 2019-07-20 18:03

@Tomalak's solution isn't completely correct and will produce wrong result in the case when there are nested tables.

The reason for this is that the XPath preceding and ancestor axes are non-overlapping.

One correct XPath expression that gives the wanted number is:

count(ancestor::table | preceding::table) + 1

So, use:

<xsl:template match="table">
    <table id="tbl_{count(ancestor::table | preceding::table) + 1}">
        <!-- further processing -->
    </table>
</xsl:template>
查看更多
登录 后发表回答