2

我很难概念化如何通过 xslt 将图像的相对路径转换为绝对路径。

当前存在一个 XML 文档,<myHTML>其中包含一个包含 html 编码文本的部分。此 html 文档可能包含<img>带有相对路径的标签 - 例如:<img src="myPic.jpg>

还存在一个 xsl,它使用如下块处理该部分:

<div id="bodyText">
  <xsl:value-of select="/abc:myT/abc:myHTML" disable-output-escaping="yes">
</div>

我需要在图像名称的开头添加一个绝对路径。由于整个 html 块是通过 访问的value-of select,我不知道如何攻击它。

我确实相信我需要使用 xsl 输入参数才能传入路径,但不确定如何<img>访问<myHTML>.

建议将不胜感激。

更新

关于 XML 文件的格式以及我所说的“html 编码文本”的含义存在一些问题。请忽略拼写错误,以下块来自内存,代表实际的 xml 文件。它旨在说明块HtmlEncode()中的<myHTML>数据。

<?xml version="1.0" encoding="UTF-8">
<?xml-stylesheet ...snipped..>
<myT xmlns="abc">
   <myHTML>
      &lt;html$gt;&lt;head$gt;&lt;title$gt;This is my title&lt;/title$gt;&lt;/head$gt;
      &lt;body$gt;
      &lt;img src="myPic.jpg" /$gt;
      &lt;/body$gt;&lt;/html$gt;
   </myHTML>
</myT>

此外,正如 Dimitre 所指出的,我使用的是 .NET,它是 XSLT 1.0 处理器。

4

3 回答 3

2

除非有充分的理由迫使您为此使用 XLST,否则我建议您使用该工具是错误的工具。将 XML 文档加载到 DOM 和 XPath 中以获取包含相关 myHtml 元素的节点集。对 HTML 进行转义并将其加载到 HTML 解析器(或者如果它是 XHTML,则为 XML 解析器)。再次 XPath 以获取 img 元素,并读取/写入 href 属性。

无论如何-如果您可以使用问题的更多详细信息更新问题,这可能会有所帮助。是否存在强制您使用 XSLT 的限制?(在这种情况下,HTML 是否以您可以可靠地进行正则表达式的方式进行转义?)性能是一个问题吗?它是什么类型的应用程序?等等等等。

于 2012-12-17T22:15:28.287 回答
0

一旦你使用xsl:value-of,你正在使用一个字符串。所以你可以使用正则表达式,但这似乎不稳定。为什么不直接使用模板?

<!-- XSL input param -->
<xsl:param name="absolute-path" select="'http://default-path/"></xsl:param>

...

<div id="bodyText">
  <xsl:apply-templates select="/abc:myT/abc:myHTML/node()"/>
</div>

...

<xsl:template match="abc:img">
  <img>
     <xsl:attribute name="src">
         <xsl:value-of select="concat($absolute-path,@src)"/>
     </xsl:attribute>
     <xsl:copy-of select="@* except @src"/>
  </img>
</xsl:template>

<xsl:template match="text()">
  <xsl:copy />
</xsl:template>
于 2012-12-17T22:00:16.463 回答
0

这个完整而简短且有效的转换

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:abc="some:abc" exclude-result-prefixes="abc">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="pBase" select="'http://www.copm.com/'"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="abc:img[@src]">
  <xsl:element name="img" namespace="some:abc">
   <xsl:attribute name="src">
     <xsl:value-of select="concat($pBase, @src)"/>
   </xsl:attribute>
   <xsl:apply-templates select="@*[not(name()='src')]|node()"/>
  </xsl:element>
 </xsl:template>
</xsl:stylesheet>

应用于以下 XML 文档时:

<myT xmlns="some:abc">
    <myHTML>
        <img src="myPic.jpg"/>
    </myHTML>
</myT>

产生想要的、正确的结果(元素的任何src属性img都转换为绝对值,使用提供的作为参数库):

<myT xmlns="some:abc">
   <myHTML>
      <img src="http://www.copm.com/myPic.jpg"/>
   </myHTML>
</myT>

更新

正如 Michael Kay 所指出的,在 XSLT 2.0 和更高版本中应该使用标准的 XPath 2.0 函数resolve-uri()

但是,从 OP 的评论中可以清楚地看出他正在使用 .NET XSLT 处理器,这意味着 XSLT 1.0 处理器。

于 2012-12-18T00:16:06.693 回答