1

我正在尝试修改以下 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
4

1 回答 1

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>

它被浏览器显示为:

大号

兰伯特

小号

史密斯

测试编辑器

Z

赞伯特编辑

说明

正确使用孟池分组法

于 2012-12-08T03:53:51.787 回答