XSL 短的 `value-of` 和 `disable-output-escaping`?

0 投票
1 回答
1172 浏览
提问于 2025-04-16 08:27

我正在处理以下的(示例)XML:

<?xml version="1.0"?>
<root>&amp; &amp; &amp;</root>

通过以下的(示例)XSL:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0">
  <xsl:output
    method="html"
    version="4.0"
    encoding="UTF-8"
    omit-xml-declaration="yes"
    />
  <xsl:template match="/">
    <input value="{/root}" />
  </xsl:template>
</xsl:stylesheet>

我使用Python和lxmllibxslt-1.1.17),得到了以下输出:

<input value="&amp;amp; &amp;amp; &amp;amp;" />

我明白我可以用以下模板来解决这个问题:

  <xsl:template match="/">
    <input>
      <xsl:attribute name="value">
        <xsl:value-of 
          select="/root" 
          disable-output-escaping="yes" 
          />
      </xsl:attribute>
    </input>
  </xsl:template>

但这需要很多的输入。之前在PHP中使用XSL时,我不记得曾经需要用这种方法来处理XML实体的引号问题,使用短格式的value-of。有没有什么简单的解决办法,这样我们就不需要一直输入上面的内容了?

1 个回答

1

其实,DOE(禁用输出转义)就是为了这种情况而设计的。抱歉,如果你已经知道这一点,我只是想说清楚。

http://www.w3.org/TR/xslt#disable-output-escaping

通常情况下,xml输出方式会在输出文本节点时对&和<(还有其他一些字符)进行转义。这是为了确保输出的内容是符合XML格式的。然而,有时候我们希望输出的内容几乎符合XML格式,但又不完全符合;比如,输出可能包含一些格式不正确的部分,这些部分打算在后续的非XML处理过程中被转换成符合XML格式的内容。正因为如此,XSLT提供了一种机制,可以禁用输出转义。一个xsl:value-of或xsl:text元素可以有一个disable-output-escaping属性……

我想真正让人头疼的是,你不能在属性值的表达式中使用DOE,比如{disable-output-escaping(root)}

所以,我想不出有什么办法可以简化这个问题。

撰写回答