XSLT使用姓氏的第一个字母进行排序

时间:2012-12-07 12:39:03

标签: xslt sorting xslt-1.0

我正在尝试修改以下xsl,以便输出与下面显示的所需输出匹配。我试图按姓氏的名字字母顺序对记录进行排序。但是目前它只是由创作者初始排序我需要它包括编辑器初始,其中记录没有创建者元素。

XML:

 <records>
  <record>
    <creators>
      <item>
        <name>
          <family>Smith</family>
          <given>Tim</given>
        </name>
      </item>
    </creators>
   </record>
  <record>
    <creators>
      <item>
        <name>
          <family>Lambert</family>
          <given>John</given>
        </name>
      </item>
    </creators>
    <editors>
      <item>
        <name>
          <family>testEDITOR</family>
          <given>Bob</given>
        </name>
      </item>
    </editors>
  </record>
 <record>
   <editors>
      <item>
        <name>
          <family>ZambertEDITOR</family>
          <given>Bob</given>
        </name>
      </item>
    </editors>
   </record>

XSL:

 <xsl:key name="initial" match="record" use="substring(creators/item/name/family,1,1)"/> 

<xsl:template match="/"> 
<xsl:for-each select="//record[generate-id(.)= generate-id(key('initial', substring(creators/item/name/family,1,1))[1])]"> 
    <xsl:sort select="substring(creators/item/name/family,1,1)"/> 
    <xsl:for-each select="key('initial', substring(creators/item/name/family,1,1))"> 
                <xsl:if test="position() = 1"> 
                   <br /><h3 class="border"> 
                   <xsl:value-of select="substring(creators/item/name/family,1,1)"/> 
          </h3> 
        </xsl:if> 
        <p>
                  <xsl:value-of select="creators/item/name/family"/> 
        </p>        
        </xsl:for-each> 
    </xsl:for-each> 
</xsl:template> 

期望的输出:

L
Lambert

S
Smith

Z
ZambertEDITOR

2 个答案:

答案 0 :(得分:1)

这是一个简单的分组问题

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:key name="kWith1stLetter" match="family" use="substring(.,1,1)"/>

 <xsl:template match="/*">
  <xsl:apply-templates select=
  "*/*/*/*/family
             [generate-id()
             =
              generate-id(key('kWith1stLetter',substring(.,1,1))[1])
             ]">
    <xsl:sort select="substring(.,1,1)" />
  </xsl:apply-templates>
 </xsl:template>

 <xsl:template match= "family">
    <h3 class="border">
     <xsl:value-of select="substring(.,1,1)"/>
    </h3>

    <xsl:apply-templates mode="inGroup"
          select="key('kWith1stLetter',substring(.,1,1))"/>
 </xsl:template>

 <xsl:template match="family" mode="inGroup">
  <p><xsl:value-of select="."/></p>
 </xsl:template>
</xsl:stylesheet>

在提供的XML文档上应用此转换时:

<records>
    <record>
        <creators>
            <item>
                <name>
                    <family>Smith</family>
                    <given>Tim</given>
                </name>
            </item>
        </creators>
    </record>
    <record>
        <creators>
            <item>
                <name>
                    <family>Lambert</family>
                    <given>John</given>
                </name>
            </item>
        </creators>
        <editors>
            <item>
                <name>
                    <family>testEDITOR</family>
                    <given>Bob</given>
                </name>
            </item>
        </editors>
    </record>
    <record>
        <editors>
            <item>
                <name>
                    <family>ZambertEDITOR</family>
                    <given>Bob</given>
                </name>
            </item>
        </editors>
    </record>
</records>

产生了想要的正确结果:

<h3 class="border">L</h3>
<p>Lambert</p>
<h3 class="border">S</h3>
<p>Smith</p>
<h3 class="border">t</h3>
<p>testEDITOR</p>
<h3 class="border">Z</h3>
<p>ZambertEDITOR</p>

,浏览器将其显示为:

大号

兰伯特

小号

史密斯

Ť

testEDITOR

ž

ZambertEDITOR

<强>解释

正确使用 Muenchian Grouping Method

答案 1 :(得分:0)

请参阅链接。 我一直在使用此链接进行开发。

http://zvon.org/comp/m/xslt.html

这个适合初学者的好网站经验丰富

我同意它的GUI界面很差,但是非常善于获取知识

谢谢, 帕