Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XML属性的XSLT转义字符_Xml_Xslt_Escaping - Fatal编程技术网

XML属性的XSLT转义字符

XML属性的XSLT转义字符,xml,xslt,escaping,Xml,Xslt,Escaping,我在一个框架(cocoon)中工作,这意味着在我生成页面后,页面会被我几乎无法控制的流程重新转换。我正在做的是进行一个web服务调用,然后将结果转换为HTML页面进行表示。听起来像是XSLT的工作。一切正常,直到XML文本节点中返回的数据包含一个“&”字符。返回的XML已正确转义,但我想将其放入锚节点的href属性中。我尝试过的每件事最后都会在href属性中显示未替换的“&”字符。例如: 如果从web服务返回的节点如下所示: <ns:name>Foo&amp;Bar</

我在一个框架(cocoon)中工作,这意味着在我生成页面后,页面会被我几乎无法控制的流程重新转换。我正在做的是进行一个web服务调用,然后将结果转换为HTML页面进行表示。听起来像是XSLT的工作。一切正常,直到XML文本节点中返回的数据包含一个“&”字符。返回的XML已正确转义,但我想将其放入锚节点的href属性中。我尝试过的每件事最后都会在href属性中显示未替换的“&”字符。例如:

如果从web服务返回的节点如下所示:

<ns:name>Foo&amp;Bar</ns:name>
<a href="ADifferentPage.jsp?name=Foo&Bar">Foo&amp;Bar</a>
<a>
  <xsl:attribute name="href">
    ADifferentPage.jsp?name=<xsl:value-of select="ns:name" />
  </xsl:attribute>
  <xsl:value-of select="ns:name" />
</a>
Foo&;酒吧
结果是

我当前的XSLT代码如下所示:

<ns:name>Foo&amp;Bar</ns:name>
<a href="ADifferentPage.jsp?name=Foo&Bar">Foo&amp;Bar</a>
<a>
  <xsl:attribute name="href">
    ADifferentPage.jsp?name=<xsl:value-of select="ns:name" />
  </xsl:attribute>
  <xsl:value-of select="ns:name" />
</a>

预期的结果是:

<a href="ADifferentPage.jsp?name=Foo&amp;Bar">Foo&amp;Bar</a>


结果与预期一致。当输出方法设置为“html”时,属性值不是xml转义的。如果可能的话,在尝试交付xml/xhtml时,请尝试将输出方法切换为“xml”。虽然桑德的回答符合我的想法,但实际上并没有解决我的问题。我应该看看其他地方的“编码与逃逸”问题。因为我试图创建的是一个有效的href,所以实际上需要对变量的内容进行编码

以下是实际传递有效href的代码:

<a>
  <xsl:attribute name="href">
    ADifferentPage.jsp?name=<xsl:value-of select="ns:name" mode="encode"/>
  </xsl:attribute>
  <xsl:value-of select="ns:name" />
</a>

<xsl:template match="ns:name" mode="encode">
   <xsl:value-of select="url:encode(text())" />
</xsl:template>


您还需要一些代码(这是我的公司提供给我的,所以我无法共享),以在Java中作为扩展进行编码。

您只需按原样键入代码,然后选择它并单击“代码”按钮,或者用4个前导空格键入所有代码。这将为您提供带有高亮显示的代码,让您不必为逃避所有HTMLYour代码的工作而头疼,您可以使用XMLSpy对我进行测试。您能否测试转换的输出,即在cocoon管道的其余部分处理输出之前?您是否试图在您的转换中添加一些东西来补偿这些后续转换的操作?如果是这样的话,那么(a)你可能想以错误的方式解决问题,因为任何这样的解决方案都是非常脆弱的,(b)为了帮助我们,我们需要更多关于这些后续转换的信息。