代码之家  ›  专栏  ›  技术社区  ›  Pavel

按键对XML元素分组

  •  -1
  • Pavel  · 技术社区  · 6 年前

    我有这个xml代码,我想按“inicial”属性分组,但没有办法。我保留了当前的xml和xsl代码。

    我曾尝试使用分组键,但无法将分组可视化,对不起,我的英语很差

    相关链接:

    http://www.microhowto.info/howto/group_xml_elements_by_key_using_xslt1.html

    https://www.codeproject.com/Articles/1849/Grouping-XML-using-XSLT

    2 回复  |  直到 6 年前
        1
  •  2
  •   FelHa    6 年前

    如果仅限于xslt 1,则可以使用muenchian分组方法:

    http://www.jenitennison.com/xslt/grouping/muenchian.html

    在您的情况下,这将起作用:

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    
        <xsl:key name="inicial" match="contacte" use="@inicial"/>
    
        <xsl:template match="/">
            <html>
                <head>
                    <title>Contactes</title>
                    <link rel="stylesheet" href="agenda.css"/>
                </head> 
                <body>
                    <h1>Contactes</h1>
                    <xsl:call-template name="mostrar_contactes"/>
                </body>
            </html>
        </xsl:template>
    
        <xsl:template name="mostrar_contactes">
            <xsl:for-each select="agenda/contacte[count(.|key('inicial', @inicial)[1]) = 1]">
    
                <h4><xsl:value-of select="@inicial" /></h4>
    
                <xsl:for-each select="key('inicial', @inicial)">
                    <xsl:sort select="cognom1"/>
                    <div class="contacte">
                        <xsl:if test="foto=''">
                            <img src="imatges/perfilneutre.jpg"/>
                        </xsl:if>
    
                        <xsl:if test="foto!=''">
                            <img src="imatges/{foto}"/>
                        </xsl:if>
    
                        <h2 class="nom"><xsl:value-of select="nom"/></h2>
                        <h2><xsl:value-of select="cognom1"/></h2>
                        <h3><xsl:value-of select="telefons/telmovil"/></h3>
                    </div>
                </xsl:for-each>
            </xsl:for-each>
        </xsl:template>
    </xsl:stylesheet>
    
        2
  •  1
  •   Daniel Haley    6 年前

    我没有查看你的相关链接,但请查看 this page on Muenchian Grouping 。它很好地解释了XSLT 1.0中的分组。

    您没有以代码的形式提供所需的输出,因此下面的示例只是添加了分组。您可能需要调整它以获得所需的显示。

    XSLT 1.0

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
      <xsl:key name="i" match="contacte" use="@inicial"/>
    
      <xsl:template match="/">
        <html>
          <head>
            <title>Contactes</title>
            <link rel="stylesheet" href="agenda.css"/>
          </head> 
          <body>
            <h1>Contactes</h1>
            <xsl:call-template name="mostrar_contactes"/>
          </body>
        </html>
      </xsl:template>
    
      <xsl:template name="mostrar_contactes">
        <xsl:for-each select="agenda/contacte[count(.|key('i',@inicial)[1])=1]">
          <xsl:sort select="cognom1"/>
    
          <h4><xsl:value-of select="@inicial" /></h4>
    
          <xsl:apply-templates select="key('i',@inicial)"/>
    
        </xsl:for-each>
      </xsl:template>
    
      <xsl:template match="contacte">
        <div class="contacte">
          <xsl:if test="foto=''">
            <img src="imatges/perfilneutre.jpg"/>
          </xsl:if>
    
          <xsl:if test="foto!=''">
            <img src="imatges/{foto}"/>
          </xsl:if>
    
          <h2 class="nom"><xsl:value-of select="nom"/></h2>
          <h2><xsl:value-of select="cognom1"/></h2>
          <h3><xsl:value-of select="telefons/telmovil"/></h3>
        </div>
      </xsl:template>
    
    </xsl:stylesheet>
    

    小提琴: http://xsltfiddle.liberty-development.net/3NzcBsC