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预定义实体引用:
<替换为<>替换为>- 把
==替换为XPath标准的= - 所有
<img>标签补全自闭合斜杠
修复后的代码片段如下:
<xsl:choose> <xsl:when test="current < 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 > 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
相关产品推荐
相关产品推荐

