地图中的保存顺序 (XSLT)

问题描述 投票:0回答:1

我需要对以下字符串中的项目进行处理和分组:

"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 中实现此目的?

xslt
1个回答
0
投票

您可以在标记化字符串上使用

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(., '^&quot;|&quot;$', '') ! 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>

在线小提琴.

© www.soinside.com 2019 - 2024. All rights reserved.