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">
    &#160;книга: <xsl:value-of select="name"/><br/>
  </xsl:template>
</xsl:stylesheet>

ответ:

издатель: Oreilly
книга: XML
книга: Java
издатель: Malysh
книга: Karlson

(проверено под IE5)

Прим: в XSLT 2.0 со всем этим проще.

 
  faq/librarytask.txt · Последние изменения: 2012/03/27 05:15
 
Нас поддерживают: Рейтинг@Mail.ruliveinternet.ru