【问题标题】:Use xsl:number together with xsl:for-each-group将 xsl:number 与 xsl:for-each-group 一起使用
【发布时间】:2022-01-05 01:27:17
【问题描述】:

考虑以下 XML 文档:

<cities>
    <city name="Milano"  country="Italia"      pop="5"/>
    <city name="Paris"   country="France"      pop="7"/>
    <city name="München" country="Deutschland" pop="4"/>
    <city name="Lyon"    country="France"      pop="2"/>
    <city name="Venezia" country="Italia"      pop="1"/>
 </cities>

使用上面的 XML 文档和 XSLT,我想得到以下输出(期望的输出):

1.Country: Italia:
       1.1. City: Milano   
       Population: 5 Millions
       1.2. City: Venezia   
        Population: 1 Millions
       total Population: 6 Millions

    2.Country: France:
       2.1. City: Paris   
       Population: 7 Millions
       2.2 City: Lyon   
       Population: 2 Millions
       total Population: 9 Millions

    3.Country: Deutschland:
       3.1 City: München   
        Population: 4 Millions
        total Population: 4 Millions

这是我的尝试(它没有给我想要的东西):

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        version="2.0">
    <xsl:template match="cities">
        <xsl:for-each-group select="city" group-by="@country">
            <xsl:number format="1."/>Country: <xsl:value-of select="current-grouping-key()"/>:
            <xsl:for-each select="current-group()">
            <!--<xsl:number count="current-group()|@name" format="1.1." level="multiple"/>: Error The current-group() function cannot be used in a pattern -->
            City: <xsl:value-of select="@name" />   
            Population: <xsl:value-of select="@pop"/> Millions</xsl:for-each>
            total Population: <xsl:value-of select="sum(current-group()/@pop)"/> Millions
        </xsl:for-each-group>
    </xsl:template> 
</xsl:stylesheet>

【问题讨论】:

    标签: xslt xslt-2.0


    【解决方案1】:

    xsl:number 您尝试的方式主要有助于根据输入结构进行编号,但也许以下就足够了:

     <xsl:template match="cities">
            <xsl:for-each-group select="city" group-by="@country">
                <xsl:number format="1." value="position()"/>Country: <xsl:value-of select="current-grouping-key()"/>:
                <xsl:variable name="group-pos" select="position()"/>
                <xsl:for-each select="current-group()">
                  
                <xsl:number value="$group-pos, position()" format="1.1." />: City: <xsl:value-of select="@name" />   
                Population: <xsl:value-of select="@pop"/> Millions
                 </xsl:for-each>
                total Population: <xsl:value-of select="sum(current-group()/@pop)"/> Millions
            </xsl:for-each-group>
        </xsl:template> 
    

    根据结果格式(如 HTML),构建嵌套的 ol/li 列表并让它们使用 CSS 编号/样式可能更容易。

    或者首先为您拥有的 xsl:numbering 创建一个临时的country/city 层次结构:

     <xsl:template match="cities">
        <xsl:variable name="countries">
          <xsl:for-each-group select="city" group-by="@country">
            <country name="{current-grouping-key()}" pop="{sum(current-group()/@pop)}">
              <xsl:copy-of select="current-group()"/>
            </country>
          </xsl:for-each-group>
        </xsl:variable>
        <xsl:for-each select="$countries/country">
            <xsl:number format="1."/>Country: <xsl:value-of select="@name"/>:
                <xsl:for-each select="city">
                  
                <xsl:number level="multiple" format="1.1." count="country | city"/>: City: <xsl:value-of select="@name" />   
                Population: <xsl:value-of select="@pop"/> Millions
                </xsl:for-each>
            total Population: <xsl:value-of select="@pop"/> Millions
        </xsl:for-each>
      </xsl:template> 
    

    【讨论】:

    • 非常感谢。它工作正常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-23
    • 2012-10-22
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多