xsl перебирает список алфавита - PullRequest
5 голосов
/ 19 июля 2010

Мне нужно перебрать алфавит az, и для каждого распечатать букву, а затем поместить какой-то код, который у меня уже есть, для отображения всех элементов в моей базе данных, которые начинаются с этой буквы.В настоящее время я использую выбор, чтобы получить первую букву всех имен элементов, которые я отображаю.Однако необходимо отобразить все буквы, а затем показать «нет элементов для отображения» там, где нет элементов.Таким образом, я больше не могу использовать свой выбор, который возвращает только буквы, содержащие элементы.

Как я могу это сделать, не печатая каждую букву жестко, а затем вызывая мой шаблон 26 раз после каждой?

1 Ответ

5 голосов
/ 20 июля 2010

Это преобразование :

<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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...