即使在转义字符后也无法让xslt输出(&)

19 xml xslt escaping invalid-characters

我试图创建一个由&符号分隔的变量赋值的查询字符串(例如:)"var1=x&var2=y&...".我计划将此字符串传递给嵌入式Flash文件.

我无法&在XSLT中显示符号.如果我只输入&没有标签,那么渲染XSLT文档就会出现问题.如果我键入&amp;时没有标签,那么文档的输出&amp;没有变化.如果我输入<xsl:value-of select="&" /><xsl:value-of select="&amp;" />我也收到错误.这可能吗?注意:我也尝试&amp;amp;过没有成功.

Kev*_*son 17

您可以结合disable-output-escaping使用CDATA部分.试试这个:

<xsl:text disable-output-escaping="yes"><![CDATA[&]]></xsl:text>
Run Code Online (Sandbox Code Playgroud)


Dim*_*hev 12

我试图创建一个由&符号分隔的变量赋值的查询字符串(例如:)"var1=x&var2=y&...".我计划将此字符串传递给嵌入式Flash文件.

我无法&在XSLT中显示符号.

这是一个可运行,简短而完整的演示如何生成这样的URL:

<xsl:stylesheet version="1.0"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:variable name="vX" select="'x'"/>
 <xsl:variable name="vY" select="'y'"/>
 <xsl:variable name="vZ" select="'z'"/>

  <xsl:template match="/">
    <xsl:value-of select=
"concat('http://www.myUrl.com/?vA=a&amp;vX=', $vX, '&amp;vY=', $vY, '&amp;vZ=', $vZ)"/>
  </xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

当此转换应用于任何源XML文档(忽略)时:

<t/>
Run Code Online (Sandbox Code Playgroud)

产生了想要的正确结果:

http://www.myUrl.com/?vA=a&vX=x&vY=y&vZ=z
Run Code Online (Sandbox Code Playgroud)

至于问题中提出的其他问题:

如果我键入&amp;时没有标签,那么文档的输出&amp;没有变化.

上述陈述根本不是真的......只需运行上面的转换并查看结果即可.

真正发生的事情:

您看到的结果是绝对正确的,但是您的输出方法是htmlxml(默认值method=),因此XSLT处理器的序列化程序必须表示正确的结果 - 字符串http://www.myUrl.com/?vA=a&vX=x&vY=y&vZ=z - 作为(部分)文本节点格式良好的XML文档或HTML树.

根据格式良好的XML文档中的定义,文字符号必须通过字符引用进行转义,例如内置的&amp;或者&#38;,或者&#x26;

请记住:表示为XML文本节点(的一部分)或HTML树中的字符串在表示为文本时可能看起来不像是相同的字符串.然而,这些是相同字符串的两种不同表示.

要更好地理解这个简单的事实,请执行以下操作:

采取上述转换并替换xsl:output声明:

 <xsl:output method="text"/>
Run Code Online (Sandbox Code Playgroud)

这一个:

 <xsl:output method="xml"/>
Run Code Online (Sandbox Code Playgroud)

此外,将输出包围在单个XML元素中.您也可以尝试使用不同的逃生用于&符号.转换现在可能如下所示:

<xsl:stylesheet version="1.0"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" method="xml"/>

 <xsl:variable name="vX" select="'x'"/>
 <xsl:variable name="vY" select="'y'"/>
 <xsl:variable name="vZ" select="'z'"/>

  <xsl:template match="/">
        <t>
            <xsl:value-of select=
 "concat('http://www.myUrl.com/?vA=a&amp;vX=', $vX, '&#38;vY=', $vY, '&#x26;vZ=', $vZ)"/>
        </t>
  </xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

结果是:

<t>http://www.myUrl.com/?vA=a&amp;vX=x&amp;vY=y&amp;vZ=z</t>
Run Code Online (Sandbox Code Playgroud)

您将使用输出方法获得相同的结果html.

问题:

输出的URL是否与第一次转换中的输出不同(甚至"损坏")?

答案:

不,在两种情况下都输出相同的字符串 - 但是在每种情况下都使用了不同的字符串表示.

问题:

我必须使用DOE(disable-output-escaping="yes")属性才能输出所需的URL吗?

答案:

不,如第一次转型所示.

问题:

是否建议使用DOE(disable-output-escaping="yes")属性来输出所需的URL?

答案:

不,使用DOE在XSLT中是一种不好的做法,通常是程序员没有很好地掌握XSLT处理模型的信号.此外,DOE只是XSLT 1.0的一个可选功能,有可能您的XSLT处理器没有实现DOE,或者即使它实现了DOE,您可能会遇到与另一个XSLT处理器运行相同转换的问题.

我来自一个不同的问题,我提出了一个赏金的问题.我的问题:我尝试生成这个onclick方法:

    <input type="submit" 
onClick="return confirm('are you sure?') && confirm('seriously?');" />
Run Code Online (Sandbox Code Playgroud)

我可以做的是:我可以将确认放在一个函数中......但是我知道我无法创建一个&一个属性!这个问题的解决是我认为解决我的问题.

回答

实际上,您可以&&通过将其表示为属性内的JavaScript表达式内的布尔运算来指定&amp;&amp;

这是一个完整的例子,每个人都可以运行,就像我在三个浏览器上一样:Chrome,Firefox 41.1.01和IE11:

HTML:

<!DOCTYPE html> 

    <html> 
      <head> 
        <link rel="stylesheet" href="style.css"> 
        <script src="script.js"></script> 
      </head> 
      <body> 
        <h1>Hello Plunker!</h1> 
        <input type="submit" 
onClick="alert(confirm('are you sure?') &amp;&amp; confirm('seriously?'));" /> 
      </body> 
    </html>
Run Code Online (Sandbox Code Playgroud)

JavaScript(script.js):

function confirm(message) { 
  alert(message); 
  return message === 'are you sure?'; 

}
Run Code Online (Sandbox Code Playgroud)

当你运行它时,你将首先得到这个警报:

在此输入图像描述

然后,在单击OK按钮后,您将收到第二个警报:

在此输入图像描述

点击后OK你最终会获得产生&&操作结果的警报:

在此输入图像描述

您可以通过改变传递给confirm()函数的参数的值来使用此代码,并验证生成的结果是否使用&&运算符.

例如,如果将<input>元素更改为:

<input type="submit" 
onClick="alert(confirm('really sure?') &amp;&amp; confirm('seriously?'));" /> 
Run Code Online (Sandbox Code Playgroud)

你会得到第一个这个警报:

在此输入图像描述

当您单击时OK,您将立即获得操作的最终结果&&:

在此输入图像描述

跳过第二个警报,因为操作的第一个操作数&&是,false并且JavaScript正在缩写&&第一个操作数所在的位置false.

总结一下:

&&通过将&&操作数指定为,可以很容易地在XSLT生成的HTML文档中的属性内使用运算符&amp;&amp;


小智 10

您是在HTML或XHTML中表达URI吗?例如,<tag attr="http://foo.bar/?key=value&amp;key2=value2&amp;..."/> 如果是这样," &amp;"是在属性值中表示&符号的正确方法,即使它看起来与您想要的文字URI不同.浏览器将&amp;在加载它们或将它们传递给Flash之前解码" "和任何其他字符实体引用.要嵌入文字,单独的" &"直接在HTML或XHTML中是不正确的.

我个人也建议学习更多关于XML的知识,以便更清楚地思考这些事情.例如,尝试更多地使用W3C DOM(不仅仅是简单的Javascript); 即使您不是日常使用它,学习DOM也可以帮助我正确地思考XML的树结构以及如何正确地考虑编码属性和元素.


Thu*_*er3 6

disable-output-escaping="yes"value-of标签中使用