XML XSL xsl: sort Не сортирует файл - PullRequest
0 голосов
/ 05 мая 2020

Я пытаюсь отсортировать эту простую таблицу по дате или местоположению, но, похоже, ничего не работает. Похоже, что сортировка вообще не применяется. Я ищу несколько советов на таких сайтах, как w3 c и форумах, но я не могу заставить его работать.

вот мой код XML:

<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet href="travelDiaries.xsl" type="text/xsl"?>
<diaries>
    <diary name='Wojciech'>
          <entry date='2020/06/12' title='Poland'>
            <location>Poland</location>
            <description>Trip to see the, family and friends in a home town</description>
            <img></img>
         </entry>
    </diary>

    <diary name='Karolina'>
        <entry date='2018/04/12' title='Poland'>
            <location>Poland</location>
            <description>Trip for site visiting, visiting a Capital city of Poland - Warsaw </description>
            <img></img>
        </entry>
    </diary>

     <diary name='Kuba'>
          <entry date='2019/03/02' title='Czech republic'>
            <location>Czech republic</location>
            <description>Visiting the Old Praque with friends, seeing most popular sites</description>
            <img></img>
         </entry>
    </diary>

     <diary name='Kevin'>
          <entry date='2020/11/08' title='Usa'>
            <location>Usa</location>
            <description>Traveling around different states, meeting people and learning about the culture</description>
            <img></img>
         </entry>
    </diary>
</diaries>

и вот XSL code:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/diaries">
        <html>
            <body>
                <table border="5">
                    <tr bgcolor="lawngreen">
                        <th>Date</th>
                        <th>Location</th>
                        <th>Description</th>
                        <th>Image</th>
                    </tr>
                <xsl:for-each select="diary">
                    <xsl:for-each select="entry">
                          <xsl:sort select="entry/@date"/>
                        <tr>
                            <td>
                                <xsl:value-of select="@date"/>
                            </td>
                            <td>
                                <xsl:value-of select="location"/>
                            </td>
                            <td>
                                <xsl:value-of select="description"/>
                            </td>
                            <td>
                                <img border="1" width="100px" height="100px">
                                    <xsl:attribute name="src">
                                <xsl:value-of select="img"/>
                                    </xsl:attribute>
                                </img>
                            </td>
                        </tr>
                    </xsl:for-each>
                </xsl:for-each>
                </table>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

Я действительно чувствую себя застрявшим с этим.

Ответы [ 3 ]

0 голосов
/ 05 мая 2020

Вы выполняете:

<xsl:for-each select="diary">
    <xsl:for-each select="entry">
        <xsl:sort select="entry/@date"/>

Это пытается отсортировать entry каждого diary - но каждый diary имеет только один entry. Кроме того, вы уже находитесь в контексте entry, и из этого контекста выражение entry/@date ничего не выбирает, потому что entry не является дочерним элементом самого себя.

Попробуйте вместо этого:

<xsl:for-each select="diary/entry">
    <xsl:sort select="@date"/>
0 голосов
/ 06 мая 2020

@ Cahirsu - Вы можете попробовать этот способ для множественной сортировки:

<xsl:template match="/">
    <xsl:variable name="pr">
        **<xsl:perform-sort select="entry">
            <xsl:sort select="@date" data-type="number" order="descending"/>
            <xsl:sort select="location" order="ascending"/>                
        </xsl:perform-sort>**
    </xsl:variable>
</xsl:template>

И применить переменную $ pr

0 голосов
/ 05 мая 2020

Вы используете один xsl:for-each слишком много.
Просто сократите код XSLT-1.0 до ...

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/diaries">
        <html>
            <body>
                <table border="5">
                    <tr bgcolor="lawngreen">
                        <th>Date</th>
                        <th>Location</th>
                        <th>Description</th>
                        <th>Image</th>
                    </tr>
                    <xsl:for-each select="diary">
                        <xsl:sort select="entry/@date"/>
                        <xsl:sort select="entry/location"/>
                        <tr>
                            <td>
                                <xsl:value-of select="entry/@date"/>
                            </td>
                            <td>
                                <xsl:value-of select="entry/location"/>
                            </td>
                            <td>
                                <xsl:value-of select="entry/description"/>
                            </td>
                            <td>
                                <img border="1" width="100px" height="100px">
                                    <xsl:attribute name="src">
                                        <xsl:value-of select="entry/img"/>
                                    </xsl:attribute>
                                </img>
                            </td>
                        </tr>
                    </xsl:for-each>
                </table>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

... и ваш результат будет отсортирован по @date и location.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...