即使转义了字符也无法使xslt输出(&)

时间:2020-03-05 18:54:46  来源:igfitidea点击:

我正在尝试创建一个由符号(例如:"" 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属性(一个布尔值)可能是实现此目的的最简单方法。请注意,我们不仅可以在&lt;xsl:value-of />上使用它,还可以在&lt;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"/>

这将防止样式表转义,并且&lt;xsl:value-of select ="'&'" />应该产生

回答

我们应该注意,可以在node或者字符串/文本的值内使用disable-output-escaping,例如:

<xsl:value-of select="/node/here" disable-output-escaping="yes" />

或者

<xsl:value-of select="'&amp;'" disable-output-escaping="yes" />
<xsl:text disable-output-escaping="yes">Texas A&amp;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-escapeingCDATA部分结合使用。试试这个:

<xsl:text disable-output-escaping="yes"><![CDATA[&]]></xsl:text>

回答

如果转换正在发出XML文档,则不应禁用输出转义。我们希望标记字符在输出中转义,以免发出格式错误的XML。我们用来处理输出的XML对象(例如DOM)将为我们取消转义文本。

如果我们使用字符串操作而不是XML对象来处理输出,那么我们会遇到问题。但是问题不在于XSLT,而在于决定使用字符串操作来处理XML,这几乎总是一个不好的选择。

如果转换正在发出HTML或者文本(并且我们已经在&lt;xsl:output>元素上设置了输出类型,对吗?),那就是另一回事了。然后在<xsl:value-of>元素上使用disable-output-escaping ='yes'是适当的。

但是无论如何,除非我们将文本包装在CDATA节中,否则我们将需要在XSLT的文本节点中转义标记字符。