-1

我正在尝试为我正在使用 XSLT 处理的项目构建姓氏目录。这就是我最终想要的样子。我希望 XSLT 通过显示人员姓氏的第一个字母的位置来获取部分搜索的索引分组,并且我希望它根据人员姓氏的第一个字母按结果中的每个部分进行分组.

请参阅下面的示例。


搜索方式:ACFGJ

一个

安德森·
安德鲁斯
·艾莉森

C

查尔斯

F

弗雷德里克斯·
弗兰克斯

G

加勒特

Ĵ

约翰逊
詹姆斯

我已经尝试了该部分的 Muenchian 分组,以使该人的姓氏的第一个首字母位于适当的字母下(即 Section A Anderson、Andrews、Allison ....J Johnson James)并且效果很好。

使用相同的代码,我尝试将其应用于生成按 ACFGJ 搜索的部分,我想根据 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'" />

您可以假设这些字母已经按字母顺序排序并且仅限于大写。

4

1 回答 1

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='ACFG 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
于 2012-07-06T01:40:31.897 回答