XSLT <而不是&lt; 抛出一个例外

mis*_*ear 1 xml xslt operators

我有一条线,我计算秒到分钟.以下以下行完全正常.

<xsl:if test="$value &gt; 60 and $value &lt; 3600 or $value - 3600 >= 1">
Run Code Online (Sandbox Code Playgroud)

Notifce >=正在被使用,没有例外.但是如果我使用下面的这一行,它将引发异常:

<xsl:if test="$value > 60 and $value < 3600 or $value - 3600 >= 1">
Run Code Online (Sandbox Code Playgroud)

结果是:

xsltproc index.xsl all.xml > index.html
index.xsl:238: parser error : Unescaped '<' not allowed in attributes values
    <xsl:if test="$value<60 or $value = 60 or $value - 60 >= 1">
Run Code Online (Sandbox Code Playgroud)

它似乎不喜欢$value < 3600$value < '3600'愿意接受$value > 3600$value > '3600'

为什么?!

Lou*_*uis 6

XML标准

这就是XML标准所说的:

&符号(&)和左尖括号(<)绝不能以字面形式出现,除非用作标记分隔符,或用于注释,处理指令或CDATA部分.如果在其他地方需要它们,则必须使用数字字符引用或字符串"&"和"<"分别进行转义.右尖括号(>)可以使用字符串">"表示,为了兼容性,必须使用">"或字符引用进行转义,当它出现在字符串"]]>"的内容中时, string不标记CDATA部分的结尾.

我们为什么要逃避<

如果<您希望此字符为字符数据而不是标记标记的开头时标准没有强制转义,则在某些情况下解析有效文档是不可能的.假设您想要一个段落,在您使用的系统中,该段落用元素表示p(如在XHTML中,或在TEI标准中),在此段落中,您希望放置此文本:

执行命令"foo <div>",其中"<div>"是你要foo的分区.

如果你可以表示<<,它将如下所示:

<p>Execute the command "foo <div>" where "<div>" is the division that you want to foo.</p>
Run Code Online (Sandbox Code Playgroud)

解析器无法知道它<div>应该被解释为字符数据,而不是开头标记.你可以拥有一个有效的案例<div>,它是一个XML元素的开头标记(在XHTML和TEI中都是如此).

为什么我们不要逃避>

我们不需要逃避的原因>(标准说我们"可能"逃避它)是要求我们<通过相同的符号逃避的规则使得解释>完全由上下文决定.换句话说,解析器可以明确地解释它.

这就是为什么解析器完全没问题,如果你放入>=>属于你的属性但不是<.