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

XSL中xsl:when的test属性含'<'字符引发良构报错如何解决

报错根因

XSL文件本质是符合XML语法规范的文档,你的代码触发报错有4个核心问题:

  • XML语法规则禁止在属性值中直接使用未转义的<、>特殊字符,这类字符会被解析器识别为XML标签的起止边界,你写的test="current<open"里的<直接命中了这个规则,触发良构校验失败。
  • 你代码里test="current>open"中的>同样属于未转义的XML特殊字符,哪怕当前报错没定位到这行,后续校验也会触发同类错误。
  • XPath语法(XSL中test属性使用的表达式语法)的相等比较运算符是单个=或eq,你写的==是通用编程语言的写法,不符合XPath规范,后续运行转换时会触发表达式执行错误。
  • 额外隐患:你代码里的<img>标签没有做XML自闭合,XML要求空标签必须以/>结尾,当前的写法后续也会触发标签未匹配的良构错误。
修复方法

你可以选择两种方式修复比较运算符的问题,同时修正其他语法错误:

方案1:使用XML实体转义特殊字符

把属性值里的特殊字符替换为XML预定义实体引用:

  • < 替换为 &lt;
  • > 替换为 &gt;
  • 把==替换为XPath标准的=
  • 所有<img>标签补全自闭合斜杠

修复后的代码片段如下:

<xsl:choose>
    <xsl:when test="current &lt; open">
        <h2 class="up">
            <img src="up.png" alt="up"/>
            <xsl:value-of select="current"/>
        </h2>
        <p><xsl:value-of select="description"/></p>
    </xsl:when>
    <xsl:when test="current &gt; open">
        <h2 class="down">
            <img src="down.png" alt="down"/>
            <xsl:value-of select="current"/>
        </h2>
        <p><xsl:value-of select="description"/></p>
    </xsl:when>
    <xsl:when test="current = open">
        <h2 class="same">
            <img src="same.png" alt="same"/>
            <xsl:value-of select="current"/>
        </h2>
        <p><xsl:value-of select="description"/></p>
    </xsl:when>
</xsl:choose>

方案2:使用XPath内置的文本比较运算符(推荐)

XPath原生提供了不需要转义的文本比较运算符,可读性更强,也不会触发XML特殊字符冲突:

  • 小于用 lt (less than)
  • 大于用 gt (greater than)
  • 等于用 eq (equal,也可以直接用=)
  • 小于等于用le,大于等于用ge,不等于用!=

对应修复后的代码片段:

<xsl:choose>
    <xsl:when test="current lt open">
        <h2 class="up">
            <img src="up.png" alt="up"/>
            <xsl:value-of select="current"/>
        </h2>
        <p><xsl:value-of select="description"/></p>
    </xsl:when>
    <xsl:when test="current gt open">
        <h2 class="down">
            <img src="down.png" alt="down"/>
            <xsl:value-of select="current"/>
        </h2>
        <p><xsl:value-of select="description"/></p>
    </xsl:when>
    <xsl:when test="current eq open">
        <h2 class="same">
            <img src="same.png" alt="same"/>
            <xsl:value-of select="current"/>
        </h2>
        <p><xsl:value-of select="description"/></p>
    </xsl:when>
</xsl:choose>
验证说明

修改完成后再用Xerces-J做良构校验,之前的<字符报错、后续会触发的>字符报错、标签未闭合报错、XPath表达式错误都会被消除,可以正常执行XSL转换。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 09:42:27