我在下面有一个示例xml字符串:
<String>
AAhelloBBworldCC!DD!</String>
而且,我希望获得AA,BB,CC和DD之间的值。我的输出应该如下所示:
<Data>
<Samp>hello</Samp>
<Name>world</Name>
<Field>!</Field>
<Elem>!</Elem>
</Data>
我正在考虑使用<xsl:analyze-string>
,但我不知道该怎么做。我刚刚开始这样做,但我不知道如何结束它。这是我的示例XSLTv2:
<xsl:template match="String">
<xsl:variable name="val" select="'AA','BB','CC','DD'"/>
<xsl:analyze-string select="normalize-space(.)" regex="[A-z]+">
<xsl:matching-substring>
<xsl:number value="index-of($val, regex-group(1))" format="01"/>
</xsl:matching-substring>
</xsl:analyze-string>
</xsl:template>
非常感谢您的反馈!
此致
答案 0 :(得分:0)
如何使用tokenize()而不是xsl:analyze-string?
[输入]
<?xml version="1.0" encoding="UTF-8"?>
<Data><String>AAhelloBBworldCC!DD!</String></Data>
[样式表]
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:output method="xml" indent="yes"/>
<xsl:variable name="elemName" as="xs:string+" select="('Samp','Name','Field','Elem')"/>
<xsl:template match="Data">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="String">
<xsl:for-each select="(tokenize(normalize-space(.),'AA|BB|CC|DD'))[string(.)]">
<xsl:variable name="position" as="xs:integer" select="position()"/>
<xsl:element name="{$elemName[$position]}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
[结果]
<?xml version="1.0" encoding="UTF-8"?>
<Data>
<Samp>hello</Samp>
<Name>world</Name>
<Field>!</Field>
<Elem>!</Elem>
</Data>