我有以下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>
答案 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>