这是我第一次使用 XSLT。我正在尝试创建一个文件,该文件将从我使用的程序导出的 XML 数据文件转换为 HTML 报告。
元素的值之一是图像文件的路径,但生成的路径是绝对路径,例如
C:\Documents and Settings\me\Desktop\xml export\cd000402.jpg
但我想要一个文件名的相对路径。
有没有办法通过 XLST 文件解析出文件名?
XPath 包含在另一个字符串第一次出现之后substring-after
返回该字符串的函数。这本身是不够的,但是像下面这样的模板可能会做到这一点:
<xsl:template name="filename-only">
<xsl:param name="path" />
<xsl:choose>
<xsl:when test="contains($path, '\')">
<xsl:call-template name="filename-only">
<xsl:with-param name="path" select="substring-after($path, '\')" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$path" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
可用的字符串函数集并不是非常广泛,但我发现它对于您在 XSLT 中需要的大多数应用程序来说已经足够了。
这有点超出了问题的范围,但Michael Kay 有一篇关于使用 XSLT 2 将纯文本解析为 XML 的优秀论文。
是的,请参阅在 XSLT 2.0 中实现的通用 LR(1) 解析器。(仅 245 行)。
我已经用它实现了一个 JSON解析器和一个 XPath 2.0 解析器——完全在 XSLT 中。
XSLT 借助 XPath 2.0 及其各种字符串函数帮助它处理这类事情。
示例:
假设有问题提到的路径 [到 jpg 文件] 来自一个 xml 片段,类似于
...
<For_HTML>
<Image1>
<Path>C:\Documents and Settings\me\Desktop\xml export\cd000402.jpg</Path>
<Description>Photo of the parking lot</Description>
<Width>123</Width>
...
</Image1>
</For_HTML>
XSLT 片段看起来像
<xsl:template match='//For_HTML/Image1'>
<img src='http://myNewServer.com/ImageBin/{substring-after(./Path,"\xml export\")}'
alt='{./Description}'
width=' .... you got the idea'
/>
</xsl:template>
注:没来得及测试;但这看起来是对的。