Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как объединить поддеревья в XSLT / 3 сообщений из 3, страница 1 из 1
18.02.2008, 22:45
    #35140282
BPK
BPK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить поддеревья в XSLT
Есть XML:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xsl" href="XSLTFile1.xslt" ?>
<BookShelf>
  <books>
    <book id="1">
      <title>Вокруг света за  80  дней</title>
      <author> 2 </author>
    </book>
    <book id="2">
      <title>Квадрант денежного потока</title>
      <author> 1 </author>
    </book>
    <book id="3">
      <title>Богатый папа, бедный папа</title>
      <author> 1 </author>
    </book>
  </books>
  <authors>
    <author id="1">
      <FirstName>Роберт</FirstName>
      <LastName>Кийосаки</LastName>
    </author>
    <author id="2">
      <FirstName>Жюль</FirstName>
      <LastName>Верн</LastName>
    </author>
  </authors>
</BookShelf>

Есть XSLTFile1.xslt:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <html>
      <head>
      </head>
      <body>
        <h1>Книги</h1>
        <table border="1" cellspacing="0" cellpadding="0">
          <tr>
            <th>id</th>
            <th>Название</th>
            <th>Автор</th>
          </tr>
          <xsl:for-each select="/BookShelf/books/book">
            <tr>
              <td>
                <xsl:value-of select="@id"/>
              </td>
              <td>
                <xsl:value-of select="title" />
              </td>
              <td>
                <xsl:value-of select="author" />
              </td>
            </tr>
          </xsl:for-each>
        </table>

        <h1>Авторы</h1>
        <table border="1" cellspacing="0" cellpadding="0">
          <tr>
            <th>ID</th>
            <th>Имя</th>
            <th>Фамилия</th>
          </tr>
          <xsl:for-each select="/BookShelf/authors/author">
            <tr>
              <td>
                <xsl:value-of select="@id" />
              </td>
              <td>
                <xsl:value-of select="FirstName" />
              </td>
              <td>
                <xsl:value-of select="LastName" />
              </td>
            </tr>
          </xsl:for-each>
        </table>

        <h1>Сводная таблица</h1>
        <table border="1" cellspacing="0" cellpadding="0">
          <tr>
            <th>Название</th>
            <th>Автор</th>
          </tr>
          <xsl:for-each select="/BookShelf/books/book">
            <tr>
              <td>
                <xsl:value-of select="title" />
              </td>
              <td>
                <xsl:value-of select="author" />
              </td>
            </tr>
          </xsl:for-each>
        </table>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

Как бы так сделать раздел "Сводная таблица", чтобы отображалось название книги и имя-фамилия автора? Т.е. фактически нужно сделать JOIN по id.
...
Рейтинг: 0 / 0
18.02.2008, 23:51
    #35140367
BPK
BPK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить поддеревья в XSLT
Получилось так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
<h1>Сводная таблица</h1>
<table border="1" cellspacing="0" cellpadding="0">
  <tr>
    <th>Название</th>
    <th>Автор</th>
  </tr>
  <xsl:for-each select="/BookShelf/books/book">
    <tr>
      <td>
        <xsl:value-of select="title" />
      </td>
      <td>
        <xsl:variable name="au">
          <xsl:value-of select="./author"/>
        </xsl:variable>
        <xsl:value-of select="/BookShelf/authors/author[@id=$au]/FirstName" />
        <xsl:text> </xsl:text>
        <xsl:value-of select="/BookShelf/authors/author[@id=$au]/LastName" />
      </td>
    </tr>
  </xsl:for-each>
</table>

Может быть вы знаете более изящные варианты?
...
Рейтинг: 0 / 0
19.02.2008, 00:03
    #35140376
BPK
BPK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить поддеревья в XSLT
Ещё компактнее:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
<h1>Сводная таблица</h1>
<table border="1" cellspacing="0" cellpadding="0">
  <tr>
    <th>Название</th>
    <th>Автор</th>
  </tr>
  <xsl:for-each select="/BookShelf/books/book">
    <tr>
      <td>
        <xsl:value-of select="title" />
      </td>
      <td>
        <xsl:variable name="au" select="./author" />
        <xsl:variable name="aobj" select="/BookShelf/authors/author[@id=$au]"></xsl:variable>
        <xsl:value-of select="$aobj/FirstName" />
        <xsl:text> </xsl:text>
        <xsl:value-of select="$aobj/LastName" />
      </td>
    </tr>
  </xsl:for-each>
</table>
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как объединить поддеревья в XSLT / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]