xslt模板输出特殊字符\(反斜杠)

时间:2018-04-05 22:34:43

标签: json xml xslt

<xsl:template match="node/@TEXT | text()" name="removequotes">
    <xsl:param name="pText" select="normalize-space(.)"/>
    <xsl:choose>
        <xsl:when test="not(contains($pText, '&quot;'))"><xsl:copy-of select="$pText"/></xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="concat(substring-before($pText, '&#92;&quot;'), '')"/>
            <xsl:call-template name="removequotes">
                <xsl:with-param name="pText" select="substring-after($pText, '&#92;&quot;')"/>
            </xsl:call-template>
        </xsl:otherwise>
    </xsl:choose>

</xsl:template>

我使用上面的XSLT在生成的JSON中打印"\。它输出我"HUDSON BAY",除了输出\"HUDSON BAY\"之外。

1 个答案:

答案 0 :(得分:1)

如果您要查找"并将其替换为\",则问题是您的substring-before()substring-after()应该使用&quot;而不是&#92;&quot;。此外,您正在连接一个空字符串值,而不是替换为。

应该是:

<xsl:template name="removequotes">
  <xsl:param name="pText" select="normalize-space(.)"/>
    <xsl:choose>
      <xsl:when test="not(contains($pText, '&quot;'))"><xsl:copy-of select="$pText"/></xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="concat(substring-before($pText, '&quot;'), '&#92;&quot;')"/>
        <xsl:call-template name="removequotes">
          <xsl:with-param name="pText" select="substring-after($pText, '&quot;')"/>
        </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="&#92;&quot;"/>

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