XSLT相对于绝对图像路径进行转换

时间:2012-12-17 21:45:54

标签: xml xslt

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

目前存在一个XML文档,其中包含一个包含html编码文本的<myHTML>部分。此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处理器。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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>

答案 2 :(得分: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处理器。