XSLT 1.0 转义字符串中的双引号和反斜杠



我有一个如下所示的字符串,并试图转换为json格式:

测试"out"和ew

预期输出为测试 \"out"和 ew

我尝试通过调用 escapequote 的模板 - 对于转义报价工作正常:

<xsl:template name="escapeQuote">
    <xsl:param name="pText" select="concat(normalize-space(.), '')" />
    <xsl:if test="string-length($pText) >0">
        <xsl:value-of select="substring-before(concat($pText, '&quot;'), '&quot;')" />
        <xsl:if test="contains($pText, '&quot;')">
            <xsl:text>"</xsl:text>    
            <xsl:call-template name="escapeQuote">
                <xsl:with-param name="pText" select="substring-after($pText, '&quot;')" />
            </xsl:call-template>
        </xsl:if>
    </xsl:if>
</xsl:template>

转义反斜杠模板 - 仅适用于反斜杠:

<xsl:template name="jsonescape">
 <xsl:param name="str" select="."/>
  <xsl:choose>
    <xsl:when test="contains($str, '')">
      <xsl:value-of select="concat(substring-before($str, ''), '\' )"/>
      <xsl:call-template name="jsonescape">
        <xsl:with-param name="str" select="substring-after($str, '')"/>
      </xsl:call-template>
    </xsl:when>
    <xsl:otherwise>
        <xsl:value-of select="$str"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

的问题如何调用两个模板或合并,请帮助我

下面是如何组合两个模板调用的示例,以便将 jsonescape 的输出用作输入参数来escapequote

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:output method="text" />
  <xsl:template match="input">
    <xsl:call-template name="escapeQuote">
      <xsl:with-param name="pText">
        <xsl:call-template name="jsonescape">
          <xsl:with-param name="str" select="." />
        </xsl:call-template>          
      </xsl:with-param>
    </xsl:call-template>
  </xsl:template>
  <xsl:template name="escapeQuote">
      <xsl:param name="pText" select="concat(normalize-space(.), '')" />
      <xsl:if test="string-length($pText) >0">
          <xsl:value-of select="substring-before(concat($pText, '&quot;'), '&quot;')" />
          <xsl:if test="contains($pText, '&quot;')">
              <xsl:text>"</xsl:text>    
              <xsl:call-template name="escapeQuote">
                  <xsl:with-param name="pText" select="substring-after($pText, '&quot;')" />
              </xsl:call-template>
          </xsl:if>
      </xsl:if>
  </xsl:template>
  <xsl:template name="jsonescape">
   <xsl:param name="str" select="."/>
    <xsl:choose>
      <xsl:when test="contains($str, '')">
        <xsl:value-of select="concat(substring-before($str, ''), '\' )"/>
        <xsl:call-template name="jsonescape">
          <xsl:with-param name="str" select="substring-after($str, '')"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
          <xsl:value-of select="$str"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>

因此,给定此输入:

<input>Test "out" and new</input>

以下是输出

Test "out" and \new

请注意,顺序很重要,因为如果颠倒模板调用的顺序,"将由escapequote模板转换为",然后由jsonescape模板转换为\"

或者,由于两个模板都执行类似的事情,即在特定字符之前放置一个,您可以将两个模板合并为一个。

也试试这个 XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:output method="text" />
  <xsl:template match="input">
    <xsl:call-template name="jsonescape">
      <xsl:with-param name="str" select="." />
    </xsl:call-template>          
  </xsl:template>
  <xsl:template name="jsonescape">
   <xsl:param name="str" select="."/>
   <xsl:param name="escapeChars" select="'&quot;'" />
   <xsl:variable name="first" select="substring(translate($str, translate($str, $escapeChars, ''), ''), 1, 1)" />
   <xsl:choose>
      <xsl:when test="$first">
        <xsl:value-of select="concat(substring-before($str, $first), '', $first)"/>
        <xsl:call-template name="jsonescape">
          <xsl:with-param name="str" select="substring-after($str, $first)"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
          <xsl:value-of select="$str"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>

相关内容

  • 没有找到相关文章

最新更新