我需要转换这个值:
<MediaFile>F:\DEMO\TEST\HELLO.pm4</MediaFile>
到此:
<MediaFile>F:\\DEMO\\TEST\\HELLO.pm4</MediaFile>
我尝试过很多东西,翻译,concat,子串和替换,但我没有成功。
这就是我尝试的内容:
源文件:
<?xml version="1.0" encoding="UTF-8" ?>
<Asset version="1.0">
<Target>
<Name>HELLO</Name>
<MediaFile>F:\DEMO\TEST\HELLO.mp4</MediaFile>
</Target>
</Asset>
XSLT:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output method="text" indent="yes" encoding="UTF-8"/>
<xsl:template match="/">
<xsl:variable name="MediaFile">
<xsl:value-of select="Asset/Target/MediaFile"/>
</xsl:variable>
<xsl:variable name="Media">
<xsl:value-of select="replace($MediaFile,'\','\\')"/>
</xsl:variable>
<xsl:element name="Media">
<xsl:value-of select="$Media"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
我正在使用xslt 2.0
有什么想法吗?感谢
答案 0 :(得分:2)
您需要替换以下
<xsl:value-of select="replace($MediaFile,'\','\\')"/>
与
<xsl:value-of select="replace($MediaFile,'\\','\\\\')" />
在许多编程语言中,反斜杠用作转义字符,表示其后面的字符需要特殊处理。在这种情况下,您需要使用\
转义要替换的字符\\
,并且还需要将\\
替换为\\\\
(两个反斜杠)。
以下问题有助于提供一些详细说明What does back slash "\" really mean?
此外,在您共享的模板中,所需的输出为text
,因此如果所需的输出为XML,则无需创建名为Media
的元素,因为它会进入画面。因此模板代码可以优化为
<xsl:template match="/">
<xsl:value-of select="replace(Asset/Target/MediaFile,'\\','\\\\')" />
</xsl:template>
输出
F:\\DEMO\\TEST\\HELLO.mp4