测试节点空虚

时间:2011-10-14 19:10:39

标签: xml xslt xpath

我有以下两个xml节点:

<CELL ROWSPAN="1" COLSPAN="3">
  <TableBodyCenterBold>
    <A ID="pgfId-179932"/>
  </TableBodyCenterBold>
</CELL>

<CELL ROWSPAN="1" COLSPAN="6">
  <TableBodyCenterBold>
    <A ID="pgfId-179938"/>
    Body Tensile Capacity (lb)
  </TableBodyCenterBold>
</CELL>

显然,第一个节点<CELL>与第二个<CELL>的不同之处在于第一个节点的<TableBodyCenterBold>没有任何文字。

我尝试了以下XPath,但都失败了:

<xsl:when test="string-length(CELL[1]/TableBodyCenterBold[1]/text()) &gt; 0">

<xsl:when test="CELL[1]/TableBodyCenterBold[1]/text()!=''">

专家能否就如何有效区分第一个节点与第二个节点提供一些帮助?

3 个答案:

答案 0 :(得分:2)

您必须考虑TableBodyCenterBold的现有空白区 - 仅文字节点子项

测试“空白”并忽略仅空白文本节点的正确表达式

CELL[1]/TableBodyCenterBold[1][not(string-length(normalize-space()) > 0)] 

当{0}当前节点的第一个true()子节点的第一个TableBodyCenterBold子节点具有字符串值时,它会准确计算到CELL,该值在规范化时会产生空字符串。< / p>

答案 1 :(得分:1)

尝试

CELL[1]/TableBodyCenterBold[1]/A[not(text())]

CELL[1]/TableBodyCenterBold/A[not(node())]

答案 2 :(得分:1)

Krakover的答案是正确的想法,但我相信他错误地包含了A节点测试步骤。我相信你正在寻找:

CELL[1]/TableBodyCenterBold[not(text())]

示例中的文字位于TableBodyCenterBold元素内,而不是A元素。

此外,由于这是一个相对XPath(它不是以/开头),您可以仔细检查是否正在针对您期望的上下文节点评估此XPath。