避免使用输出方法html在XSLT中进行url编码



我有一个输出HTML的转换。为了避免在旧浏览器中可能会中断的自关闭标签(例如<img />而不是<img></img>),输出方法必须是html。然后,虽然应用了url编码,但它破坏了我的应用程序。例如:

输入

<html>
<head>
</head>
<body>
{{example}}
<a href="{{example}}" >abc</a>
<img src="http://placehold.it/20x20"></img>
</body>
</html>
转换

<?xml version="1.0" encoding="utf-8"?>
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" /><!-- either -->
<xsl:output method="html" indent="yes" /><!-- or -->
<xsl:template match="@*|node()">
    <xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy>
</xsl:template>
</xsl:transform>

在第一种情况下,输出是:

<?xml version="1.0"?>
<html>
<head>
</head>
<body>
{{example}}
<a href="{{example}}">abc</a>
<img src="http://placehold.it/20x20"/>
</body>
</html>

第二种情况的输出是:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
{{example}}
<a href="%7B%7Bexample%7D%7D">abc</a>
<img src="http://placehold.it/20x20">
</body>
</html>

第一种情况的好处是@href属性是而不是url编码的。这是我申请的必备条件。第二种变体的缺点是,<img>是自关闭的。这不能用于<img>标签和其他一些标签。

有没有一种方法可以在没有url编码的情况下获得method="html"的好处?如果是,怎么做?

在XSLT 2.0中,可以使用序列化选项escape-uri-attributes="no"来抑制URL属性的%-编码。在XSLT 1.0中没有相应的

如果使用PHP的XSLT 1.0处理器,那么您可以尝试以下解决方案…

  1. 使用方法="html";
  2. Include this template…

    <xsl:template match="@href">
      <xsl:attribute name="Muttaburrasaurus">
        <xsl:value-of select="." />
      </xsl:attribute>
    </xsl:template>
    
  3. 将结果输出装入字符串,并用href替换出现的所有Muttaburrasaurus

如果将来迁移到Java,正如您在评论提要中指出的那样,那么请确保您的处理器是XSLT 2.0+。然后,您可以使用M.Kay提到的escape-uri-attributes特性。

相关内容

  • 没有找到相关文章

最新更新