我在变量中的消息下面。
7c {"code":3001,"message":"issued"} 0
我想以' {'并以'}'结尾使用XSLT。我尝试使用sub-string()
和starts-with
函数,但没有成功。
我的最终出局应该是
{"代码":3001,"消息":"发出"}
答案 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
属性的内容。
{
和}
个字符(它们不在此作为重复的分隔符
计算前面的正则表达式)。出于这个原因,我们必须先行
每个人都有反斜杠。(...)
。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')"/>
得到相同的结果。