我很难概念化如何通过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>
<html$gt;<head$gt;<title$gt;This is my title</title$gt;</head$gt;
<body$gt;
<img src="myPic.jpg" /$gt;
</body$gt;</html$gt;
</myHTML>
</myT>
另外,正如Dimitre指出的那样,我正在使用.NET,它是XSLT 1.0处理器。
答案 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处理器。