Q. Задача библиотекаря
пусть дана библиотека:
<books>
<book>
<name>XML</name>
<publisher>Oreilly</publisher>
<book>
<book>
<name>Karlson</name>
<publisher>Malysh</publisher>
<book>
<book>
<name>Java</name>
<publisher>Oreilly</publisher>
<book>
</books>
хочу получить список всех издателей с их книгами:
Oreilly:
XML
Java
Malysh:
Karlson
A [taler]. Подходов и вариантов тут может быть не один, но насмотря на простоту постановки задачи, она “сложновата объяснениями”. Попросили закинуть мой вариант - предложу тот, что на мой взляд, “какой бы порекомендовал и быть может, даже не очень сложный в понимании” (в любом случае необходимо использование ключей).
<?xml version="1.0"?>
<xsl:stylesheet...>
<xsl:key name="pub" match="publisher" use="."/>
<xsl:template match="book">
<xsl:if test="generate-id(publisher) = generate-id(key('pub',publisher)[1])">
издатель: <xsl:copy-of select="publisher"/>
<xsl:apply-templates select = "//book[publisher=current()/publisher]" mode="pub" />
</xsl:if>
</xsl:template>
<xsl:template match="book" mode="pub">
 книга: <xsl:value-of select="name"/><br/>
</xsl:template>
</xsl:stylesheet>
ответ:
издатель: Oreilly
книга: XML
книга: Java
издатель: Malysh
книга: Karlson
(проверено под IE5)
Прим: в XSLT 2.0 со всем этим проще.