1

我有以下 XML。

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

我需要@V属性中的值 when @Nis NonEnglishAbstract。这个值应该是在将每次出现的 [DE]、[FR] 或方括号内的任何两个大写字母的模式替换为一些 HTML 内容之后,如示例输出中所示。

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

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

示例输出:

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

1 回答 1

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}})\]([^\[]+)如果您希望匹配更具体,可以将正则表达式更改为。

于 2013-09-17T04:55:04.550 回答