我需要对以下字符串中的项目进行处理和分组:
"fl, ob1, ob2, cordib (Fa), fag1, fag2, cor1 (Fa), cor2 (Fa), vl1, vl2, vla1, vla2, Vitellia, vlc-b"
我尝试利用地图和递归模板方法来实现它,结果应该像这样:
map {
"fl": 1,
"ob": 2,
"cordib": 1,
"fag": 2,
...
"vlc-b": 1
}
我需要保留顺序,但默认情况下地图似乎不允许这样做。可以启用此功能吗?
是否有其他方法可以在 XSLT 中实现此目的?
您可以在标记化字符串上使用
for-each-group
,它保留顺序,作为数据类型,如果您想使用地图,我只看到一系列地图的选项,例如
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="3.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
expand-text="yes">
<xsl:param name="input" as="xs:string" expand-text="no">"fl, ob1, ob2, cordib (Fa), fag1, fag2, cor1 (Fa), cor2 (Fa), vl1, vl2, vla1, vla2, Vitellia, vlc-b"</xsl:param>
<xsl:output method="adaptive"/>
<xsl:template match="/" name="xsl:initial-template">
<xsl:variable name="groups" as="map(xs:string, xs:integer)*">
<xsl:for-each-group select="tokenize($input, '\s*,\s*') ! replace(., '^"|"$', '') ! replace(., '[ 0-9]+', '') ! replace(., '\(.*\)', '')" group-by=".">
<xsl:sequence select="map { current-grouping-key() : count(current-group()) }"/>
</xsl:for-each-group>
</xsl:variable>
<xsl:sequence select="$groups"/>
</xsl:template>
</xsl:stylesheet>