名称目录的XSLT分组

时间:2012-07-05 22:08:14

标签: xml xslt xpath grouping muenchian-grouping

我正在尝试为我正在使用XSLT的项目构建一个Last Name目录。这就是我最终想要的样子。我希望XSLT为部分搜索选择索引分组,它显示该人姓氏的第一个字母,并且我希望它根据人名的第一个字母按结果中的每个部分进行分组。

请参阅下面的示例。


搜索:A C F G J

A

安德森
安卓
艾里

C

查尔斯

˚F

弗雷德里克斯
直率

盖瑞特

Ĵ

约翰逊
詹姆斯

我已经尝试过Muenchian分组,让这个人的姓氏的第一个首字母在相应的字母下面(即A部分Anderson,安德鲁斯,Allison ...... J Johnson James)并且工作正常。

使用相同的代码,我尝试将其应用于该部分以生成Search By A C F G J,其中我想根据XML中的数据显示该人姓氏的第一个字母。尝试使用代码时,我没有得到任何结果。

有人可以帮忙吗? 感谢

干杯


更新

OP希望转换此输入文档......

<people>
 <person><lastname>Johnson</lastname></person>
 <person><lastname>James</lastname></person>
 <person><lastname>Charles</lastname></person>
 <person><lastname>Franks</lastname></person>
 <person><lastname>Anderson</lastname></person>
 <person><lastname>Allison</lastname></person>
 <person><lastname>Fredericks</lastname></person>
 <person><lastname>Andrews</lastname></person>
</people>

...使用XSLT进入上面显示的文本格式化输出文档。目前尚不清楚OP是否使用XSLT 1.0或2.0。搜索字母作为样式表参数提供给样式表,格式为空格分隔的大写字母列表,如此声明...

<xsl:param name="search-by" select="'A C F G J'" />

您可以假设这些字母已按字母顺序排序,并且限制为大写。

1 个答案:

答案 0 :(得分:0)

如果您按参数提供按字母排序,则不需要muenchian分组。

这个XSLT 1.0样式表...

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:param name="search-by" select="'A C F G J'" />

<xsl:key name="section" match="person" use="substring( lastname, 1, 1)" />

<xsl:template match="/">
Search by: <xsl:value-of select="$search-by" /><xsl:value-of select="'&#x0A;&#x0A;'" />   
  <xsl:call-template name="do-section">
    <xsl:with-param name="sections" select="$search-by" /> 
  </xsl:call-template>  
</xsl:template>

<xsl:template name="do-section">
 <xsl:param name="sections" />
 <xsl:if test="$sections != ''" > 
  <xsl:variable name="letter" select="substring($sections,1,1)" />
  <xsl:value-of select="concat( $letter, '&#x0A;&#x0A;')" />
  <xsl:for-each select="key('section',$letter)">
   <xsl:sort data-type="text" /> 
   <xsl:value-of select="concat( lastname, '&#x0A;')" />   
  </xsl:for-each>   
  <xsl:value-of select="'&#x0A;'" />   
  <xsl:call-template name="do-section">
    <xsl:with-param name="sections" select="substring($sections,3)" /> 
  </xsl:call-template>  
 </xsl:if> 
</xsl:template>  

</xsl:stylesheet>

...应用输入样式表参数$ search-by ='A C F G J'并应用于此输入文档......

<people>
 <person><lastname>Johnson</lastname></person>
 <person><lastname>James</lastname></person>
 <person><lastname>Charles</lastname></person>
 <person><lastname>Franks</lastname></person>
 <person><lastname>Anderson</lastname></person>
 <person><lastname>Allison</lastname></person>
 <person><lastname>Fredericks</lastname></person>
 <person><lastname>Andrews</lastname></person>
</people>

...制作此文本文件......

Search by: A C F G J

A

Allison
Anderson
Andrews

C

Charles

F

Franks
Fredericks

G


J

James
Johnson