XSLT统计第一个空节点之前的所有同级元素数量问题
问题分析与解决方案
咱们先拆解下你的问题和代码问题所在:
你的代码为什么返回0?
你写的代码:
<xsl:variable name="NumFields" select="count(preceding-sibling::table/tr[1]/td[.=''])" />
核心问题是路径逻辑完全错了:
preceding-sibling::table是在找当前节点的「前序兄弟节点」中的<table>元素,但你的当前节点如果是<td>(或者在<tr>上下文里),<td>的同级节点只能是其他<td>,根本不存在同级的<table>,所以这个路径匹配不到任何节点,count自然返回0。- 你要找的是「第一个空
<td>的所有前序同级<td>」,而不是去遍历table下的tr。
正确的实现方式
根据你的需求(统计第一个空<td>之前的同级<td>数量),分两种上下文场景给出写法:
场景1:上下文是<tr>节点(比如你正在处理<tr>元素)
先定位到第一个空的<td>,再统计它的前序兄弟<td>数量:
<!-- 先找到<tr>下第一个空的<td> --> <xsl:variable name="firstEmptyTd" select="td[.=''][1]" /> <!-- 统计这个空<td>前面的所有同级<td> --> <xsl:variable name="NumFields" select="count($firstEmptyTd/preceding-sibling::td)" />
或者用更简洁的链式写法:
<xsl:variable name="NumFields" select="count(td[position() < position(td[.=''][1])])" />
场景2:上下文就是那个空<td>节点本身
如果你的代码已经在第一个空<td>的上下文里,直接统计它的前序兄弟<td>即可:
<xsl:variable name="NumFields" select="count(preceding-sibling::td)" />
验证你的示例
对于你给出的XML结构:
<table> <tr> <td>x</td> <td>y</td> <td>q</td> <td>z</td> <td></td> <td>o</td> </tr> </table>
用场景1的代码,$firstEmptyTd会匹配到第5个<td>,它的preceding-sibling::td有4个,所以$NumFields的值就是4,完全符合你的预期。
内容的提问来源于stack exchange,提问作者marionetek
相关产品推荐
相关产品推荐

