XSLT 1.0在字符串

时间:2016-05-26 05:58:18

标签: json xslt xslt-1.0

我有一个像下面这样的字符串并尝试转换为json格式:

测试“out”和\ new

预期产量是 测试“out”和\ new

我尝试通过调用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>

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

1 个答案:

答案 0 :(得分:8)

以下是如何组合两个模板调用的示例,以便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模板到\

或者,由于两个模板都做了类似的事情,在特定字符之前放置<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> ,您可以将两个模板合并为一个。

尝试这个XSLT

LINEAR