You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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() &lt; 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:22:17