我有以下两个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()) > 0">
或
<xsl:when test="CELL[1]/TableBodyCenterBold[1]/text()!=''">
专家能否就如何有效区分第一个节点与第二个节点提供一些帮助?
答案 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。