XSLT将反斜杠转换为双反斜杠

时间:2018-06-01 19:01:07

标签: json xslt path unc slash

我需要转换这个值:

    <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

有什么想法吗?感谢

1 个答案:

答案 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