即使转义了字符也无法使xslt输出(&)
我正在尝试创建一个由&
符号(例如:"" var1 = x&var2 = y&..."`)分隔的变量赋值查询字符串。我计划将此字符串传递到嵌入式Flash文件中。
我无法在XSLT中显示&
符号。如果我只键入&
,并且周围没有标签,则呈现XSLT文档时会出现问题。如果我键入&
且标签周围没有标签,则文档的输出为&
不变。如果输入<xsl:value-of select ="&" />
或者<xsl:value-of select ="&" />
,我也会收到错误消息。这可能吗?注意:我也尝试过&
,但没有成功。
解决方案
回答
在value-of
标签中使用disable-output-escaping =" yes"
回答
尝试:
<xsl:value-of select ="&" disable-output-escaping =" yes" />
很抱歉,如果格式弄乱了。
回答
使用disable-output-escaping
属性(一个布尔值)可能是实现此目的的最简单方法。请注意,我们不仅可以在<xsl:value-of />
上使用它,还可以在<xsl:text>
上使用它,根据特定情况,它可能更干净。
这是规范的相关部分:http://www.w3.org/TR/xslt#disable-output-escaping
回答
如果我们要在其他标记的属性(例如" embed")中将查询字符串作为更大的URL的一部分来创建,则实际上我们希望将&转换为&。尽管所有浏览器都会弄清楚意思,然后做正确的事,但是如果要将生成的文档传递给验证器,则会在属性值中标记未转义的&。
回答
我们是用HTML还是XHTML表示URI?例如`<tag attr =" http://foo.bar/?key = value&key2 = value2&..." />它看起来与所需的文字URI不同。浏览器将在加载"或者"以及将其传递给Flash之前对其进行解码,并对其进行解码。要将文字直接嵌入HTML或者XHTML中是不正确的。
我个人还建议学习更多有关XML的知识,以便以更清晰的方式考虑这些事情。例如,尝试更多地使用W3C DOM(不仅仅是琐碎的Javascript);即使我们不是每天都使用它,学习DOM也可以帮助我正确地考虑XML的树结构以及如何正确地编码属性和元素。
回答
如果我们尝试生成XML文件作为输出,则将要生成&
(因为&
本身是无效的XML)。如果只是产生一个字符串,则应通过将以下内容作为xsl:stylesheet的子代,将样式表的输出模式设置为text。
<xsl:output method="text"/>
这将防止样式表转义,并且<xsl:value-of select ="'&'" />
应该产生&
。
回答
我们应该注意,可以在node或者字符串/文本的值内使用disable-output-escaping,例如:
<xsl:value-of select="/node/here" disable-output-escaping="yes" />
或者
<xsl:value-of select="'&'" disable-output-escaping="yes" /> <xsl:text disable-output-escaping="yes">Texas A&M</xsl:text>
请注意xsl:value-of中的单引号。
但是,我们不能对属性使用disable-output-escapeing。我知道它已经完全搞砸了,但这就是XSLT 1.0中的情况。因此,以下操作将无效:
<xsl:value-of select="/node/here/@ttribute" disable-output-escaping="yes" />
因为在精美的文字中是引号:
Thus, it is an error to disable output escaping for an <xsl:value-of /> or <xsl:text /> element that is used to generate the string-value of a comment, processing instruction or attribute node;
强调我的。
摘自:http://www.w3.org/TR/xslt#disable-output-escaping
回答
我们可以将disable-output-escapeing
与CDATA
部分结合使用。试试这个:
<xsl:text disable-output-escaping="yes"><![CDATA[&]]></xsl:text>
回答
如果转换正在发出XML文档,则不应禁用输出转义。我们希望标记字符在输出中转义,以免发出格式错误的XML。我们用来处理输出的XML对象(例如DOM)将为我们取消转义文本。
如果我们使用字符串操作而不是XML对象来处理输出,那么我们会遇到问题。但是问题不在于XSLT,而在于决定使用字符串操作来处理XML,这几乎总是一个不好的选择。
如果转换正在发出HTML或者文本(并且我们已经在<xsl:output>
元素上设置了输出类型,对吗?),那就是另一回事了。然后在<xsl:value-of>元素上使用disable-output-escaping ='yes'
是适当的。
但是无论如何,除非我们将文本包装在CDATA节中,否则我们将需要在XSLT的文本节点中转义标记字符。