powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как объединить поддеревья в XSLT
3 сообщений из 3, страница 1 из 1
Как объединить поддеревья в XSLT
    #35140282
BPK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть 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
Как объединить поддеревья в XSLT
    #35140367
BPK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Получилось так:

Код: 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
Как объединить поддеревья в XSLT
    #35140376
BPK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё компактнее:
Код: 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
3 сообщений из 3, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как объединить поддеревья в XSLT
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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