XSLT 2.0 - 替换字符串中的匹配模式

时间:2013-09-17 04:34:01

标签: regex xslt xslt-2.0

我有以下XML。

<GSP>
  <RES>
     <R N="1">
        <MT N="NonEnglishAbstract" V="[DE]Deutsch Abstract text[FR]French Abstract text"/>
     </R>
  </RES>
</GSP>

@V@N时,我需要NonEnglishAbstract属性中的值。此值应该在替换每次出现的[DE],[FR]或基本上方括号内的两个大写字母的任何模式之后,使用一些HTML内容,如示例输出中所示。

我可以使用XSLT 2.0解决方案。

我想我可以使用一些正则表达式模式和tokenize()来实现结果,但是没有专业知识可以将它们放在一起。

示例输出:

<p class='DE'>Deutsch Abstract text </p>
<p class='FR'>French Abstract text </p>

1 个答案:

答案 0 :(得分:1)

我建议使用xsl:analyze-string

示例:

XML输入

<GSP>
    <RES>
        <R N="1">
            <MT N="NonEnglishAbstract" V="[DE]Deutsch Abstract text[FR]French Abstract text"/>
        </R>
    </RES>
</GSP>

XSLT 2.0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="MT[@N='NonEnglishAbstract']">
        <xsl:analyze-string select="@V" regex="\[([^\[\]]+)\]([^\[]+)">
            <xsl:matching-substring>
                <p class="{regex-group(1)}">
                    <xsl:value-of select="regex-group(2)"/>
                </p>
            </xsl:matching-substring>
        </xsl:analyze-string>
    </xsl:template>

</xsl:stylesheet>

<强>输出

<p class="DE">Deutsch Abstract text</p>
<p class="FR">French Abstract text</p>

如果您希望匹配更具体,可以将正则表达式更改为\[([A-Z]{{2}})\]([^\[]+)