1

使用xsltproc (XSLT 1.0) 我试图从 xsl-value @name 属性中转义 (" -> to \") 内容。

XSL:

<xsl:template match="int:signature">
    "name":"<xsl:value-of select="@name" mode="text"/>",
    ....

原始 XML:

<signature name="My &quot;case&quot;" />

输出:

 "name":"My "case"",

这会破坏生成的 JSON

我试过使用str:replace没有成功。disable-output-escaping="yes"也没有成功。

有什么提示吗?

--

xsltproc -V

使用 libxml 20706、libxslt 10126 和 libexslt 815

4

2 回答 2

0

这适用于 XPath 2.0

"name":"<xsl:value-of select='fn:replace(@name, """", "\\""")' />"

据我所知,xsltproc 不支持 Xpath 2.0,但也许 EXSLT 扩展提供了相同的功能

于 2013-04-26T16:21:37.073 回答
0

如果您需要逃避这样的事情会有所帮助

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space  elements="*"/>
    <xsl:template match ="signature">
        <xsl:variable name="escape">
            <xsl:call-template name="escape_quot">
                <xsl:with-param name="replace" select="@name"/>
            </xsl:call-template>
        </xsl:variable>
        "name":"<xsl:value-of select="$escape" />",
    </xsl:template>

    <xsl:template name="escape_quot">
        <xsl:param name="replace"/>
        <xsl:choose>
            <xsl:when test="contains($replace,'&quot;')">
                <xsl:value-of select="substring-before($replace,'&quot;')"/>
                <!-- escape quot-->
                <xsl:text>\"</xsl:text> 
                <xsl:call-template name="escape_quot">
                    <xsl:with-param name="replace" select="substring-after($replace,'&quot;')"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$replace"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

这将产生惯常的输出。

 "name":"My \"case\"",

更新:
但是将外部引号更改为撇号还不够吗?

和:

 "name":'<xsl:value-of select="@name" />',

要得到:

  "name":'My "case"',

(这应该是有效的 JSON)

于 2013-04-26T17:07:19.160 回答