Xml XSLT将相对图像路径转换为绝对图像路径

Xml XSLT将相对图像路径转换为绝对图像路径,xml,xslt,Xml,Xslt,我很难概念化如何通过xslt将图像的相对路径转换为绝对路径 当前存在一个XML文档,它有一个保存html编码文本的节。此html文档可能包含 还有一个xsl,它使用如下块处理该部分: <div id="bodyText"> <xsl:value-of select="/abc:myT/abc:myHTML" disable-output-escaping="yes"> </div> 此外,正如Dimitre指出的那样,我使用的是.NET及其XSLT1.0

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

当前存在一个XML文档,它有一个保存html编码文本的节
。此html文档可能包含

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

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

此外,正如Dimitre指出的那样,我使用的是.NET及其XSLT1.0处理器。

一旦使用
xsl:value of
,您就在使用字符串。所以你可以使用正则表达式,但这似乎不可靠。为什么不使用模板呢

<?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>

...
...

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


在任何情况下,如果你能用你的问题的更多细节来更新问题,可能会有所帮助。是否存在强制您使用XSLT的约束?(在这种情况下,HTML转义的方式是否可以可靠地针对regex?)性能是否存在问题?它是什么类型的应用程序?等等等等这一完整的、短暂的、有效的转变

<!-- 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>
更新

<!-- 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>
正如Michael Kay所指出的,在XSLT 2.0和更高版本中,应该使用标准XPath 2.0函数


然而,从OP的评论中可以清楚地看出,他使用的是.NET XSLT处理器,这意味着XSLT1.0处理器。

这是有道理的。现在要尝试这种方法。@xelco52刚刚修复了text()模板中的一个错误,仅供参考。.NET似乎不喜欢这行:
。获取错误:
“select”是“xsl:attribute”元素的无效属性。
。很抱歉,我没有对此进行测试。答案中已修复。xsl:attribute的select属性需要XSLT 2.0。我从问题中推断XSLT已经存在,因此我认为这是一个遗留问题。@Dominic,您显然是低级过程编程的爱好者。如果必须的话,你自己也要坚持老方法,但我们中的一些人更喜欢声明式方法。不是真的@MichaelKay,我喜欢XSLT(考虑到我在你的书中花了好几个小时的时间,这可能部分是你的错。)老实说,我只是在等待Dimitre使用他通常的基于身份转换的方法,如果数据是XML,这是正确的,但问题是它是“html编码的文本”,不管这意味着什么。因为这是可以解释的,所以我要求澄清。@DominicCronin,无论“html编码文本”是什么意思,OP都明确表示这是用XSLT处理的:“还有一个xsl处理该部分”,基于此,我相信通过“html编码文本”,OP意味着“html标记”,因为他能够用XSLT处理它,所以这很可能是XHtml。至于我的“通常的身份转换”,你的意思是使用身份转换是不合适的吗?如果是的话,你能举个例子吗?:)@迪米特伦诺瓦切夫我不是说你错了,但这个问题可以从两个方面来考虑。(myHTML的价值不处理img标记)由于您通常很快就能提供高质量的XSLT解决方案,我真的很期待您给出的答案。正如您在我看到的几个答案中指出的,从身份转换开始,然后“覆盖”有趣的位是一种非常强大的技术。我很高兴地假设,不仅您会提供这种答案,而且您会比我做得更好。但请注意,在XSLT 2.0中,resolve-uri()函数提供了一种比concat()更“准确”的方式来形成绝对uri。以这种方式使用concat()将失败(例如,如果输入已经是绝对URI),并且将给出混乱的结果(例如,如果相对URI以“./”@MichaelKay开头,绝对正确)。我假设OP需要XSLT1.0解决方案。在XSLT2.0中,一定要使用resolve-uri()。我更新了问题以澄清xml格式。@xelco52,如果没有扩展函数,在纯XSLT 1.0中无法做到这一点(除非完全在XSLT 1.0中实现xml解析器)。您对具有扩展功能的解决方案感兴趣吗?
<myT xmlns="some:abc">
    <myHTML>
        <img src="myPic.jpg"/>
    </myHTML>
</myT>
<myT xmlns="some:abc">
   <myHTML>
      <img src="http://www.copm.com/myPic.jpg"/>
   </myHTML>
</myT>