xsl遍历字母表列表

时间:2010-07-19 17:57:43

标签: arrays xslt

我需要遍历字母a-z,并为每一个打印字母,然后放置一些我已经工作的代码,以显示我的数据库中以该字母开头的所有项目。目前,我正在使用选择来检索我显示的所有项目名称的第一个字母。但是,要求是显示所有字母,然后在没有项目的情况下显示“没有要显示的项目”。所以,我不能再使用我的选择,它只返回包含项目的字母。

如何在不对每个字母进行硬编码的情况下执行此操作,然后在每个字母后调用我的模板26次?

1 个答案:

答案 0 :(得分:5)

此转化

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

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

 <xsl:variable name="vDoc" select="/"/>

 <xsl:variable name="vAlphabet" select=
 "'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"
 />

 <my:message>No items found.</my:message>

 <xsl:variable name="vMessage" select="document('')/*/my:message"/>

 <xsl:template match="/">
   <xsl:for-each select=
     "(document('')//node()|document('')//@*|document('')//namespace::*)
                          [ not(position() > 26)]
     ">

     <xsl:variable name="vcurLetter" select=
       "substring($vAlphabet, position(), 1)"/>
     <xsl:for-each select="$vDoc">
       <xsl:variable name="vSearchResult" select=
        "key('kItemBy1stLetter', $vcurLetter)"/>

       <xsl:value-of select="concat('&#xA;',$vcurLetter, ': &#xA;')"/>

       <xsl:copy-of select="$vSearchResult | $vMessage[not($vSearchResult)]/text()"/>
      </xsl:for-each>
      <xsl:text>&#xA;</xsl:text>
   </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

应用于此XML文档(扮演“数据库”角色)时:

<database>
 <item>Bicycles</item>
 <item>Computers</item>
 <item>Cars</item>
 <item>Forks</item>
 <item>Gellato</item>
 <item>Hypervehicles</item>
 <item>Ichtiosaurs</item>
 <item>Jobs</item>
 <item>Knots</item>
 <item>Lens</item>
 <item>Miracles</item>
 <item>Notes</item>
</database>

产生想要的结果

A: 
No items found.

B: 
<item>Bicycles</item>

C: 
<item>Computers</item>
<item>Cars</item>

D: 
No items found.

E: 
No items found.

F: 
<item>Forks</item>

G: 
<item>Gellato</item>

H: 
<item>Hypervehicles</item>

I: 
<item>Ichtiosaurs</item>

J: 
<item>Jobs</item>

K: 
<item>Knots</item>

L: 
<item>Lens</item>

M: 
<item>Miracles</item>

N: 
<item>Notes</item>

O: 
No items found.

P: 
No items found.

Q: 
No items found.

R: 
No items found.

S: 
No items found.

T: 
No items found.

U: 
No items found.

V: 
No items found.

W: 
No items found.

X: 
No items found.

Y: 
No items found.

Z: 
No items found.