【问题标题】:Avoid URL-encoding in XSLT with output method html使用输出方法 html 在 XSLT 中避免 URL 编码
【发布时间】:2013-01-14 23:56:17
【问题描述】:

我有一个输出 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 编码。这对我的应用程序来说是必须的。第二种变体虽然不好,但更好的是,&lt;img&gt; 是自动关闭的。这不能用于&lt;img&gt; 标签和其他一些标签。

有没有办法在没有 URL 编码的情况下获得method="html" 的好处?如果是,怎么做?

【问题讨论】:

  • 我怀疑这可能取决于处理器。你用的是哪一个?尽管在这种情况下百分比编码是正确的 - HTML 中 ahref 必须是有效的 URI。是否可以选择使用 ((example)) 而不是 {{example}} 作为括号 在 URI 中允许
  • 我正在使用 PHP de3.php.net/manual/en/class.xsltprocessor.php 类,但将来也可能会使用基于 Java 的处理器。使用不同样式的括号是个好主意,但我不确定这是否适用于我们当前的应用程序。不过,谢谢!
  • 您确定自闭合标签(与未闭合标签相比)会破坏旧版浏览器吗?我的印象是真的旧浏览器只是将/视为一个属性名称,前面有一个空格。
  • @Eric 我不确定它们是否会破坏所有或特别是非常旧的浏览器,但至少有一些我需要支持的渲染引擎对它们很挑剔。

标签: html xslt-1.0 urlencode


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    1. 使用method="html";
    2. 包含此模板...

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-02
      • 2015-05-02
      • 2016-12-30
      • 2013-06-15
      • 2022-10-31
      • 1970-01-01
      相关资源
      最近更新 更多