XSLT<而不是<抛出一个例外

时间:2013-12-23 22:36:47

标签: xml xslt operators

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

<xsl:if test="$value &gt; 60 and $value &lt; 3600 or $value - 3600 >= 1">

通知正在使用>=而没有例外。但是,如果我在下面使用以下这一行,它将抛出异常:

<xsl:if test="$value > 60 and $value < 3600 or $value - 3600 >= 1">

结果:

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">

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

为什么?!

2 个答案:

答案 0 :(得分:6)

XML标准

这是XML standard对此的评价:

  

&符号(&amp;)和左尖括号(&lt;)绝不能以字面形式出现,除非用作标记分隔符,或用于注释,处理指令或CDATA部分。如果在其他地方需要它们,必须使用数字字符引用或字符串“&amp;”进行转义。和“&lt;”分别。可以使用字符串“&gt;”来表示直角括号(&gt;),并且为了兼容性,必须使用“&gt;”来转义。或出现在字符串“]]&gt;中的字符引用在内容中,当该字符串未标记CDATA部分的结尾时。

为什么我们必须逃离<

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

  

执行命令“foo&lt; div&gt;”其中“&lt; div&gt;”是你想要去的师。

如果您可以将<表示为<,则它看起来像这样:

<p>Execute the command "foo <div>" where "<div>" is the division that you want to foo.</p>

解析器无法知道<div>是要解释为字符数据,而不是开头标记。你可以将<div>作为XML元素的开头标记(在XHTML和TEI中都是如此)的情况同样有效。

为什么我们不需要逃避>

我们不需要转义>(标准说我们“可能”逃避它)的原因是,要求我们通过相同的标记转义<的规则会导致>的解释{1}}完全由上下文决定。换句话说,解析器可以明确地解释它。

这就是为什么如果你在属性中加>=>而不是<,解析器就完全没了。

答案 1 :(得分:2)

XML Specification禁止未转义的'&lt;'在大多数位置,包括属性值。

这是因为'&lt;'是基本XML标记结构的起始字符,在其他地方禁用它可以使解析成为可能。

XSLT必须是有效的XML,因此适用相同的规则。