我需要遍历字母a-z,并为每一个打印字母,然后放置一些我已经工作的代码,以显示我的数据库中以该字母开头的所有项目。目前,我正在使用选择来检索我显示的所有项目名称的第一个字母。但是,要求是显示所有字母,然后在没有项目的情况下显示“没有要显示的项目”。所以,我不能再使用我的选择,它只返回包含项目的字母。
如何在不对每个字母进行硬编码的情况下执行此操作,然后在每个字母后调用我的模板26次?
答案 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('
',$vcurLetter, ': 
')"/>
<xsl:copy-of select="$vSearchResult | $vMessage[not($vSearchResult)]/text()"/>
</xsl:for-each>
<xsl:text>
</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.