XSLT-1.0从消息中读取特定的子字符串

时间:2017-03-02 17:00:30

标签: xslt xslt-1.0

我在变量中的消息下面。

7c
 {"code":3001,"message":"issued"}
 0
 

我想以' {'并以'}'结尾使用XSLT。我尝试使用sub-string()starts-with函数,但没有成功。

我的最终出局应该是

  

{"代码":3001,"消息":"发出"}

2 个答案:

答案 0 :(得分:1)

在XSLT 2.0中,您可以在analyze-string内部使用matching-substring来处理捕获的正则表达式

让我们来看一个例子。从下面给出的源XML开始:

<?xml version="1.0" encoding="UTF-8"?>
<main>
  <message>7c {"code":3001,"message":"issued"} 0</message>
</main>

然后我们可以使用这样的XSLT:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:output method="xml" encoding="UTF-8" indent="yes" />

  <xsl:template match="message">
    <xsl:copy>
      <xsl:analyze-string select="." regex="\{{(.*)\}}">
        <xsl:matching-substring>
          <xsl:value-of select="regex-group(1)"/>
        </xsl:matching-substring>
      </xsl:analyze-string>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="@*|node()">
    <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
  </xsl:template>
</xsl:transform>

请注意regex属性的内容。

  • 在XSLT中,花括号必须加倍,以便区分它们 属性值模板
  • 但是这些花括号是文字花括号,即我们正在寻找 仅适用于{}个字符(它们不在此作为重复的分隔符 计算前面的正则表达式)。出于这个原因,我们必须先行 每个人都有反斜杠。
  • 在这些大括号之间,我们有一个捕获组(...)
  • 我们在下面的regex-group(1)中引用了捕获组的内容。

如果需要,可以在正则表达式中添加更多捕获组以进行捕获 消息的各个部分,然后使用它们。

但如果您真的受限于XSLT 1.0,您可以:

  • substring-before开始,切断}以及之后的所有内容。
  • 然后使用substring-after切断{以及之前的所有内容。

或许您需要围绕花括号的文字? 然后使用concat添加{并添加}

答案 1 :(得分:1)

  

我尝试过substring-after和之前的文本,然后在&#39; {&#39;和   之前&#39;}&#39;

如果您正在使用XSLT 1.0,那么就这样做,并将缺少的分隔符添加为文本 - 例如:

<xsl:variable name="var">7c {"code":3001,"message":"issued"} 0 </xsl:variable>

<xsl:text>{</xsl:text>
<xsl:value-of select="substring-before(substring-after($var, '{'), '}')"/>
<xsl:text>}</xsl:text>

返回:

{"code":3001,"message":"issued"}

在XSLT 2.0中,您可以简单地执行:

<xsl:value-of select="replace($var, '.*(\{.*\}).*', '$1')"/>

得到相同的结果。