首页 > 解决方案 > 如何使用 XSLT 2.0 在 XML 文档中查找第一个表

问题描述

我想在 xml 文档中找到第一个表。我在下面提到了例子。

输入

<doc>
    <first>
        <table-cover>
            <table>
                <thead>Table1</thead>
                <tbody>Table1</tbody>
            </table>
        </table-cover>
    </first>
    <first>
        <second>
            <table-cover>
                <table>
                    <thead>Table2</thead>
                    <tbody>Table2</tbody>
                </table>
        </table-cover>
        </second>
    </first>
    <first>
        <table-cover>
            <table>
                <thead>Table3</thead>
                <tbody>Table3</tbody>
            </table>
        </table-cover>
    </first>
</doc>

我想为<first-table>文档中的第一个表添加特殊元素

试过的模板:

<xsl:template match="table-cover">
    <xsl:choose>
        <xsl:when test="table/position() eq 1">
            <!-- code -->
        </xsl:when>
        <xsl:otherwise>
            <!-- code -->
        </xsl:otherwise>
    <xsl:choose>
</xsl:template>

但是当我使用上面的模板时,所有表都被选中并为所有表应用条件。我只想申请<xsl:when test="table/position() eq 1">第一张桌子。

如何通过更改来解决此问题<xsl:when test="??????">

我正在使用XSLT 2.0. 谢谢

标签: xmlxslt-2.0

解决方案


您可以测试 a 是否table是文档中的第一个表

test="empty(table/preceding::table)"

我将在这里使用两个模板规则,而不是 xsl:choose。

如果文档很大,那么测试每个表以查看是否有任何更早的表是低效​​的。更快的方法是将全局变量绑定到第一个表:

<xsl:variable name="first-table" select="(//table)[1]"/>

然后针对此变量测试后续表:

<xsl:template match="table[. is $first-table]">...

推荐阅读