如何强制转义每个双引号"进入XML字符实体"



如何将字符串中的所有"转换为"

示例:

源数据:<String>"ACCOUNT_DETAILS" : "75"</String>

目标数据:<String>&quot;ACCOUNT_DETAILS&quot; : &quot;75&quot;</String>

PS:我使用的是XSLT1.0。我尝试过讨论"XSLT字符串替换",但它不起作用。

为什么要做这样的事情?从XML的角度来看,&quot;"完全相同。当单引号和双引号作为文字出现在属性中时,任何XSLT处理器(或XML库(都会正确地转义它们,这通常是它们需要分别转义为&apos;&quot;的唯一位置。

但是,如果有一些奇怪的要求必须这样做(有很多工具只部分支持XML或其变体(,您可以执行以下操作:

<xsl:text disable-output-escaping="yes">&amp;quot;</xsl:text>

它将输出&quot;。请注意,处理器不需要支持disable-output-escaping,即使它支持,也不必遵守,并且从XSLT2.0开始,您应该使用xsl:character-map,这是一个更好、更灵活的替代方案。

使用XSLT1.0的字符串替换模板

接下来的问题可能是如何将此技术应用于整个字符串。由于XSLT1.0没有一个好的字符串搜索和替换函数,所以必须使用递归调用模板。对于这个练习(我对XSLT1.0有点生疏,通常使用XSLT2.0或更高版本,其中这是一行代码(,我想为了旧时代的缘故,我应该再试一次。

这适用于您的输入:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    <xsl:variable name="input">"ACCOUNT_DETAILS" : "75"</xsl:variable>
    <xsl:template match="/">
        <xsl:variable name="result">
            <xsl:call-template name="replace">
                <xsl:with-param name="string" select="$input"/>
                <xsl:with-param name="search" select="'&quot;'" />
                <xsl:with-param name="replace-with" select="'&amp;quot;'" />
            </xsl:call-template>
        </xsl:variable>
        <xsl:value-of select="$result" disable-output-escaping="yes" />
    </xsl:template>
    <xsl:template name="replace">
        <xsl:param name="string" />
        <xsl:param name="search" />
        <xsl:param name="replace-with" />        
        <xsl:choose>
            <xsl:when test="contains($string, $search)">
                <xsl:value-of select="substring-before($string, $search)" />
                <xsl:value-of select="$replace-with" />
                <xsl:call-template name="replace">
                    <xsl:with-param name="string" select="substring-after($string, $search)" />
                    <xsl:with-param name="search" select="$search" />
                    <xsl:with-param name="replace-with" select="$replace-with" />
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$string" />
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

和输出:

&quot;ACCOUNT_DETAILS&quot; : &quot;75&quot;

编辑:使用JSON转义"

在您写的注释中,您要求JSON使用此功能。使用JSON转义可能更容易,因为它们在XML中没有特殊意义。

取我上面的代码,按如下方式调用它,并删除disable-output-escaping:

<xsl:call-template name="replace">
    <xsl:with-param name="string" select="$input"/>
    <xsl:with-param name="search" select="'&quot;'" />
    <xsl:with-param name="replace-with" select="'&quot;'" />
</xsl:call-template>

或者,如果您想要XML样式的转义,您可以使用上面相同的代码对引号进行双重转义,但不使用disable-output-escaping,而不是直接将&quot;写入输出流(这只是写入"的另一种方式,任何XML解析器都会对此进行解释(。然后,文本XML将包含&amp;quot,您的浏览器或XML解析器将看到它为&quot;(在取消捕获后(。

我认为在XSLT2.0中应该可以使用字符映射:http://xsltransform.net/pPzifoT/1.使用XSLT1.0,您可以使用一个命名模板,用<xsl:text disable-output-escaping="yes"><![CDATA[&quot;]]></xsl:text>替换双引号。

相关内容

  • 没有找到相关文章

最新更新