如何将字符串中的所有"
转换为"
?
示例:
源数据:<String>"ACCOUNT_DETAILS" : "75"</String>
目标数据:<String>"ACCOUNT_DETAILS" : "75"</String>
PS:我使用的是XSLT1.0。我尝试过讨论"XSLT字符串替换",但它不起作用。
为什么要做这样的事情?从XML的角度来看,"
与"
完全相同。当单引号和双引号作为文字出现在属性中时,任何XSLT处理器(或XML库(都会正确地转义它们,这通常是它们需要分别转义为'
和"
的唯一位置。
但是,如果有一些奇怪的要求必须这样做(有很多工具只部分支持XML或其变体(,您可以执行以下操作:
<xsl:text disable-output-escaping="yes">&quot;</xsl:text>
它将输出"
。请注意,处理器不需要支持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="'"'" />
<xsl:with-param name="replace-with" select="'&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>
和输出:
"ACCOUNT_DETAILS" : "75"
编辑:使用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="'"'" />
<xsl:with-param name="replace-with" select="'"'" />
</xsl:call-template>
或者,如果您想要XML样式的转义,您可以使用上面相同的代码对引号进行双重转义,但不使用disable-output-escaping
,而不是直接将"
写入输出流(这只是写入"
的另一种方式,任何XML解析器都会对此进行解释(。然后,文本XML将包含&quot
,您的浏览器或XML解析器将看到它为"
(在取消捕获后(。
我认为在XSLT2.0中应该可以使用字符映射:http://xsltransform.net/pPzifoT/1.使用XSLT1.0,您可以使用一个命名模板,用<xsl:text disable-output-escaping="yes"><![CDATA["]]></xsl:text>
替换双引号。