我有以下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>
答案 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}})\]([^\[]+)
。