在<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
相关产品推荐
相关产品推荐

