<xsl:template match="node/@TEXT | text()" name="removequotes">
<xsl:param name="pText" select="normalize-space(.)"/>
<xsl:choose>
<xsl:when test="not(contains($pText, '"'))"><xsl:copy-of select="$pText"/></xsl:when>
<xsl:otherwise>
<xsl:value-of select="concat(substring-before($pText, '\"'), '')"/>
<xsl:call-template name="removequotes">
<xsl:with-param name="pText" select="substring-after($pText, '\"')"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
我使用上面的XSLT在生成的JSON中打印"
和\
。它输出我"HUDSON BAY"
,除了输出\"HUDSON BAY\"
之外。
答案 0 :(得分:1)
如果您要查找"
并将其替换为\"
,则问题是您的substring-before()
和substring-after()
应该使用"
而不是\"
。此外,您正在连接一个空字符串值,而不是替换为。
应该是:
<xsl:template name="removequotes">
<xsl:param name="pText" select="normalize-space(.)"/>
<xsl:choose>
<xsl:when test="not(contains($pText, '"'))"><xsl:copy-of select="$pText"/></xsl:when>
<xsl:otherwise>
<xsl:value-of select="concat(substring-before($pText, '"'), '\"')"/>
<xsl:call-template name="removequotes">
<xsl:with-param name="pText" select="substring-after($pText, '"')"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
如果对这些值使用命名参数,则可能更容易阅读(和调试):
<xsl:template name="removequotes">
<xsl:param name="pText" select="normalize-space(.)"/>
<xsl:param name="find" select="'$quot;'"/>
<xsl:param name="replace" select="\""/>
<xsl:choose>
<xsl:when test="not(contains($pText, $find))"><xsl:copy-of select="$pText"/></xsl:when>
<xsl:otherwise>
<xsl:value-of select="concat(substring-before($pText, $find), $replace)"/>
<xsl:call-template name="removequotes">
<xsl:with-param name="pText" select="substring-after($pText, $find)"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>