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

在<xsl:for-each select="1 to n">中选择XML节点报错的求助

解决XSLT3循环整数时筛选节点的报错问题

报错原因

当你使用<xsl:for-each select="1 to 7">循环时,当前上下文对象是整数类型(比如1、2等),而非XML节点。这直接导致两种写法报错:

  • document/planning/meeting[@day = current()]:相对路径(document/...)需要以节点作为上下文遍历子轴,但当前上下文是整数,不符合要求,因此抛出“Context item for child axis is not a node”错误。
  • //meeting[@day = current()]://语法需要从上下文节点的根节点开始遍历,但当前上下文是整数,不是节点,无法定位根,因此抛出“Context item for '/' must be a node”错误。

解决方案

核心思路是提前获取XML节点集合并存储到变量中,在整数循环里直接引用变量筛选节点,避免依赖错误的上下文。

步骤1:定义全局变量存储节点集合

在XSLT的顶层(<xsl:stylesheet>下、所有模板之外)定义变量,保存根节点或所有会议节点:

<!-- 保存XML根节点 -->
<xsl:variable name="xml-root" select="/"/>
<!-- 直接保存所有会议节点,后续筛选更高效 -->
<xsl:variable name="all-meetings" select="$xml-root/document/planning/meeting"/>

步骤2:在整数循环中引用变量筛选

在1 to 7的循环内,使用变量筛选对应日期的会议:

<xsl:for-each select="1 to 7">
  <!-- 保存当前循环的日期数字 -->
  <xsl:variable name="current-day" select="."/>
  
  <!-- 筛选当天的会议 -->
  <xsl:for-each select="$all-meetings[@day = $current-day]">
    <!-- 这里处理单个会议的内容,示例输出标题、时间 -->
    <div class="meeting">
      <h3><xsl:value-of select="@title"/></h3>
      <p>时间:<xsl:value-of select="@time"/></p>
    </div>
  </xsl:for-each>
</xsl:for-each>

替代方案:直接使用绝对路径

如果不想定义变量,也可以在循环中直接用绝对路径定位节点(/开头表示从根节点开始):

<xsl:for-each select="1 to 7">
  <xsl:for-each select="/document/planning/meeting[@day = current()]">
    <!-- 处理会议内容 -->
  </xsl:for-each>
</xsl:for-each>

这种写法无需变量,但每次循环都会重新遍历根节点查找会议,性能略低于提前存储变量的方式。

验证执行

保持你的执行命令不变:

xslt3 -xsl:../stylesheets/input.xsl -s:../stylesheets/input.xml -o:../output/output.html -t

修改XSLT代码后重新执行,即可正常筛选对应日期的会议节点。

内容的提问来源于stack exchange,提问作者inVoKer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 16:05:28