Невозможно перечислить относительные элементы XSLT 2.0 - PullRequest
0 голосов
/ 22 ноября 2018

Я пытаюсь выучить XSLT 2.0.В приведенном ниже примере я пытаюсь перечислить языки и книги, доступные на каждом языке.Не могли бы вы помочь мне понять, как работает контекст?

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="Library.xsl"?>
<Library>
    <Books>
        <Book>
            <Language code="English">English</Language>
            <code>1</code>
            <Title>History</Title>
        </Book>
        <Book>
            <Language code="Spanish">Spanish</Language>
            <code>2</code>
            <Title>Math</Title>
        </Book>
    </Books>
    <Languages>
        <Language code="English">English</Language>
        <Language code="Spanish">Spanish</Language>
    </Languages>
</Library>

// Таблица стилей

<?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <html>
            <body>
                <table>
                    <xsl:for-each select="/Library/Languages/Language">
                        <tr>
                            <td style="border:1px solid red;">
                                <xsl:value-of select="@code" /><br /><br />
                                <xsl:variable name="key" select="@code" />
                            </td>
                        </tr>
                        <xsl:for-each select="/Library/Books/Book">
                            <xsl:if test="Language[@code=string($key)]">
                            <tr>
                                <td style="border:1px solid red;">
                                    <xsl:value-of select="@code" />
                                </td>
                            </tr>
                            </xsl:if>
                        </xsl:for-each>
                    </xsl:for-each>
                </table>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

// Желаемый вывод:

Language: English
Title: English Book

Language: Spanish
Title: Spanish Book

1 Ответ

0 голосов
/ 23 ноября 2018

Чтобы получить желаемый результат, вы можете изменить файл XSLT-1.0 на следующий (XSLT-2.0, по-видимому, не требуется).Одним из важных аспектов было перемещение <xsl:variable name="key" select="@code" /> из элемента td вверх на два слоя, чтобы к нему можно было получить доступ в xsl:for-each.

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <html>
            <body>
                <table>
                    <xsl:for-each select="/Library/Languages/Language">
                        <xsl:variable name="key" select="@code" />
                        <tr>
                            <td style="border:1px solid red;">
                                <xsl:value-of select="concat('Language: ', @code)" /><br /><br />
                            </td>
                        </tr>
                        <xsl:for-each select="/Library/Books/Book[Language[@code=$key]]">
                            <tr>
                                <td style="border:1px solid red;">
                                    <xsl:value-of select="concat('Title: ', $key,' Book')" />
                                </td>
                            </tr>
                        </xsl:for-each>
                    </xsl:for-each>
                </table>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

Вывод:

<html>
  <body>
    <table>
        <tr>
          <td style="border:1px solid red;">Language: English</td>
        </tr>
        <tr>
          <td style="border:1px solid red;">Title: English Book</td>
        </tr>
        <tr>
          <td style="border:1px solid red;">Language: Spanish</td>
        </tr>
        <tr>
          <td style="border:1px solid red;">Title: Spanish Book</td>
        </tr>
    </table>
  </body>
</html>
...