XSL:如何检查当前节点的任何祖先是否是特定节点

时间:2016-02-28 16:44:02

标签: xml xslt xpath

让我们说我们有这个XML:

          <ce:table id="table2">
                <ce:label>Table 2</ce:label>
                <ce:caption >
                    <ce:simple-para >Hello</ce:simple-para>
                </ce:caption>
                <ce:alt-text >Table 2</ce:alt-text>
                <tgroup cols="2">
                    <colspec colname="col1"/>
                    <colspec colname="col2"/>
                    <thead valign="top">
                        <row rowsep="1">
                            <entry align="left">Sub1</entry>
                            <entry align="left">Sub2</entry>
                        </row>
                    </thead>
                    <tbody>
                        <row>
                            <entry role="rowhead" align="left">
                                <ce:list id="list1">

                                </ce:list>
                            </entry>
                        </row>
                    </tbody>
                </tgroup>
            </ce:table>

如何检查ce:table节点是否有ce:list节点,在这种情况下,XSLT条件应返回true。

任何想法!

3 个答案:

答案 0 :(得分:2)

如果要使用XPath选择后代,请使用例如ce:table/descendant::ce:listce:table//ce:list。在test属性内部,如果存在任何此类节点,则选择将产生true。

答案 1 :(得分:2)

当然:

<xsl:when test="ce:table/*[local-name() = 'ce:list'] ">

没有工作,因为

  • local-name()明确地为您提供没有前缀的名称,它永远不会返回ce:list
  • 您引用的ce:list不是ce:table的直接子女,而是后代。
  

如何检查ce:table节点是否有ce:list节点

像这样:

<xsl:when test="ce:table//ce:list"> ... </xsl:when>

通过编写选择它的XPath表达式来检查是否存在节点。如果该节点不存在,则表达式返回一个空节点集,该节点集在布尔上下文中计算为false

布尔上下文是<xsl:if><xsl:when>中的测试,但也是更复杂的XPath表达式中的谓词:

ce:table[.//ce:list]/ce:label

选择<ce:label>的所有<ce:table>个孩子,但条件是<ce:table>在某个地方有<ce:list>个后代。

答案 2 :(得分:2)

如果您当前的节点是

/data/ce:table

您可以使用

检查ce:list子节点是否存在
<xsl:if test=".//ce:list">

.//表示从当前节点下降的所有节点,不考虑深度。