XSLT 2.0 支持正则表达式,另一方面是 XSLT 1.0 解决方案:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pSuffix" select="'FR'"/>
<xsl:template match="/*">
<xsl:apply-templates/>
<xsl:value-of select=
"concat('{',g[last()]/@id +1, '}')"/>
</xsl:template>
<xsl:template match="g">
<xsl:value-of select=
"concat('{',@id, '}',
substring-before(., '_'), '_', $pSuffix
)"/>
</xsl:template>
</xsl:stylesheet>
当应用于此 XML 文档(您的“字符串”,包装到单个顶部元素中以使其成为格式良好的 XML 文档)时:
<t>
<g id="1">TEST_EN</g> <g id="2">TEST_EN</g>
</t>
产生想要的正确结果:
{1}TEST_FR{2}TEST_FR{3}
反向转换:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pSuffix" select="'EN'"/>
<xsl:template match="text()" name="makeXml">
<xsl:param name="pText" select="."/>
<xsl:param name="pId" select="1"/>
<xsl:if test=
"contains($pText, '{') and contains($pText, '}')">
<xsl:variable name="vPiece" select=
"substring-before(substring-after($pText, '}'), '{')"/>
<g id="{$pId}"><xsl:value-of select=
"concat(substring-before($vPiece, '_'), '_', $pSuffix)"/></g>
<xsl:call-template name="makeXml">
<xsl:with-param name="pId" select="$pId +1"/>
<xsl:with-param name="pText" select=
"substring-after(substring-after($pText, '}'), '{')"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
当此转换应用于第一个转换的结果时(再次包装在单个顶部元素中以使其成为格式良好的 XML 文档):
<t>{1}TEST_FR{2}TEST_FR{3}</t>
产生想要的正确结果:
<g id="1">TEST_EN</g><g id="2">TEST_EN</g>