XSLT 2.0:替换符合特定条件的模式

时间:2014-04-24 11:50:01

标签: regex xslt-2.0

我有以下XML

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

我使用下面的XSLT格式化输出,如下面进一步给出的

XSLT

         

<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>

输出

<p class="DE">Deutsch Abstract text</p>
<p class="FR">French Abstract text</p>
<p class="AB">Not new language</p>

XSLT中的正则表达式匹配任何模式,如[DE],[FR],[AB],[CD]等。现在我只想匹配某些像[DE],[FR]等我有的模式在逗号分隔的变量中,如

<xsl:variable name="language-code>
    <xsl:value-of select="'[DE],[FR],[RU]'"/>
</xsl:variable>

在此更改方案中使用的修改正则表达式是什么?

修改后的输出应为

<p class="DE">Deutsch Abstract text</p>
<p class="FR">French Abstract text[AB]Not new language</p>

1 个答案:

答案 0 :(得分:0)

我稍微更改了参数值以传递语言代码:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions"
  exclude-result-prefixes="xs fn">

<xsl:param name="language-codes" as="xs:string*" select="'DE', 'FR', 'RU'"/>
<xsl:variable name="lang-regex" select="concat('\[(', string-join($language-codes, '|'), ')\]')"/>

<xsl:output method="html" indent="yes"/>

<xsl:template match="MT[@N='NonEnglishAbstract']">
  <xsl:variable name="matches">
    <xsl:analyze-string select="@V" regex="{$lang-regex}">
        <xsl:matching-substring>
          <p class="{regex-group(1)}"/>
        </xsl:matching-substring>
        <xsl:non-matching-substring>
          <value><xsl:value-of select="."/></value>
        </xsl:non-matching-substring>
    </xsl:analyze-string>
  </xsl:variable>
  <xsl:for-each select="$matches/p">
    <p class="{@class}">
      <xsl:value-of select="following-sibling::value[1]"/>
    </p>
  </xsl:for-each>
</xsl:template>

</xsl:stylesheet>