如何修复XSLT 3.0中xsl:iterate与xsl:break的报错问题?
解决XSLT 3.0中
xsl:break must be the last instruction in the xsl:iterate loop报错 问题原因
报错的核心原因是:xsl:break执行后,循环体内不能存在任何会被后续执行的指令。你的代码里,xsl:break位于xsl:choose的otherwise分支,但xsl:choose之后还跟着xsl:next-iteration——触发xsl:break时,后续的xsl:next-iteration仍会被解析,违反了xsl:break必须作为循环最后执行指令的语法规则。
修正方案
调整代码结构,将xsl:next-iteration移到需要继续迭代的分支中(即前两个xsl:when分支的末尾),确保触发xsl:break时没有后续指令需要执行。
修正后的XSLT代码
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions"> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:template match="/primes"> <xsl:iterate select="i"> <xsl:param name="cnt" select="1"/> <xsl:choose> <xsl:when test="position()=1"> Prime: 2 <xsl:next-iteration> <xsl:with-param name="cnt" select="$cnt+1" as="xs:integer"/> </xsl:next-iteration> </xsl:when> <xsl:when test="position() le 5"> Prime <xsl:value-of select="."/> Leap: <xsl:value-of select=". - /*//i[$cnt - 1]"/> <xsl:next-iteration> <xsl:with-param name="cnt" select="$cnt+1" as="xs:integer"/> </xsl:next-iteration> </xsl:when> <xsl:otherwise> <xsl:break/> </xsl:otherwise> </xsl:choose> <xsl:on-completion> Primes are fun. </xsl:on-completion> </xsl:iterate> </xsl:template> </xsl:stylesheet>
说明
- 将
xsl:next-iteration分别放入前两个xsl:when分支内,仅当需要继续迭代时才执行该指令。 - 进入
otherwise分支触发xsl:break时,循环体内无后续指令,符合XSLT 3.0的语法要求。 xsl:on-completion不受影响,会在循环正常结束或被xsl:break终止时执行。
内容的提问来源于stack exchange,提问作者Chong Lip Phang
相关产品推荐
相关产品推荐

