我有一个输出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处理器,那么您可以尝试以下解决方案…
- 使用方法="html";
-
Include this template…
<xsl:template match="@href"> <xsl:attribute name="Muttaburrasaurus"> <xsl:value-of select="." /> </xsl:attribute> </xsl:template>
-
将结果输出装入字符串,并用
href
替换出现的所有Muttaburrasaurus
如果将来迁移到Java,正如您在评论提要中指出的那样,那么请确保您的处理器是XSLT 2.0+。然后,您可以使用M.Kay提到的escape-uri-attributes
特性。