Есть ли способ использовать {} внутри цикла for-each в XSLT? - PullRequest
0 голосов
/ 29 декабря 2018

Я пытаюсь создать html-страницу, используя xslt, и теперь я столкнулся с препятствием на пути использования элемента for-each.Обсуждаемая строка выглядит следующим образом:

<xsl:for-each select="../../*:subscritores/subscritor[@userID = '{@userID}']/*:video">

Кто-нибудь знает, как я могу запустить цикл for-each для разных пользователей, когда пользователь четко помечен в более ранней части кода?

Если я пытаюсь просто напечатать @userID, я получаю правильный результат, означающий, что он должен работать как положено.

Я попытался проанализировать xpath, и он возвратил список узлов (как и предполагалось).Я также попытался перебором, заменив {@userID} на действительный идентификатор пользователя, и он работал нормально, сказав, что проблема действительно в этой части.

Полный код здесь:

XML - https://pastebin.com/CBhmUPRQ

XSL - https://pastebin.com/Jzb3yG3N

XSL (импортированный файл) - https://pastebin.com/NfVGxwy4

Кроме того, большинство данных записывается на португальском языке, а остальные -полный бред.При необходимости я с удовольствием переведу все, что вы сочтете необходимым.

Правка - При необходимости DTD находится здесь https://pastebin.com/6fHdTset

1 Ответ

0 голосов
/ 29 декабря 2018

В общем, кажется, что у вас есть переменные элементы, связанные значением атрибута, и вы хотите следовать перекрестным ссылкам на основе значения атрибута, поэтому наиболее эффективный способ в XSLT - объявить ключи с xsl:key, а затем использовать key функция для отслеживания перекрестных ссылок, например,

<xsl:key name="subscritor-por-id" match="subscritor" use="@userID"/>
<xsl:key name="video-por-id" match="video" use="@videoID"/>
<xsl:key name="comentario-por-user" match="comentario" use="de/@userID"/>

, тогда код (без включения, но он должен показать принципиальный подход) становится

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns="http://www.w3.org/1999/xhtml" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="xhtml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:output doctype-public="-//W3C//DTD XHTML 1.1//EN" doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"/>
    <xsl:strip-space elements="*"/>
    <xsl:template match="/">
        <html xml:lang="pt">
            <head>
                <title>Pagina Utilizador - Vista Longa</title>
                <link rel="stylesheet" type="text/css" href="../CSS.css" charset="UTF-8"/>
            </head>
            <body>
                <div id="barra_de_navegacao">
                    <a href="../main.xhtml" class="button1">Pagina Inicial</a>
                    <a href="../listas/videos.html" class="button1">Vídeos</a>
                    <a href="../listas/lista_videos.html" class="button1">Lista de videos</a>
                    <a href="../listas/lista_users.html" class="button1">Lista de utilizadores</a>
                </div>
                <div class="display" id="user">
                    <xsl:apply-templates select="//user[@userID = 'user001']"/>
                    <!-- Para mudar utilizador, mudar aqui-->
                </div>
            </body>
        </html>
    </xsl:template>

    <xsl:key name="subscritor-por-id" match="subscritor" use="@userID"/>
    <xsl:key name="video-por-id" match="video" use="@videoID"/>
    <xsl:key name="comentario-por-user" match="comentario" use="de/@userID"/>

    <xsl:template match="user">
        <xsl:apply-imports/>
        <div class="user_subscricoes">
            <h1>
                <xsl:value-of select="@userID"/>
            </h1>
            <h3>Subscrições</h3>
            <h3>Videos</h3>
            <ul>
                <!-- Comecando em user, precisamos subir na arvore, até á raiz para depois poder descer em direção aos subscritores-->
                <xsl:for-each select="key('subscritor-por-id', @userID)/*:video">
                    <li>
                        <a href="../videos/{@videoID}.xhtml" class="button2">
                            <xsl:value-of select="key('video-por-id', @videoID)/nome"/>
                        </a>
                    </li>
                </xsl:for-each>
            </ul>
        </div>
        <div id="user_comentarios">
            <!---->
            <h1>
                <xsl:value-of select="@userID"/>
            </h1>
            <!---->
            <h3>Comentários</h3>
            <ul>
                <xsl:for-each select="key('comentario-por-user', @userID)">
                    <li>
                        <div class="button2">
                            <a href="../Vídeos/socialtube-vid001.xhtml"> <xsl:value-of select="/texto"/></a>
                        </div>
                    </li>
                </xsl:for-each>
            </ul>
        </div>
    </xsl:template>
</xsl:stylesheet>

https://xsltfiddle.liberty -development.net / 6qVRKxn / 1

...