让我们说我们有这个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。
任何想法!
答案 0 :(得分:2)
如果要使用XPath选择后代,请使用例如ce:table/descendant::ce:list
或ce: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">
.//
表示从当前节点下降的所有节点,不考虑深度。