XML с несколькими таблицами стилей XSLT

У меня есть файл xml, который открывается файлом xslt:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="eventsoverview.xsl"?>
<events>
  <item>
    <date>7/5/2013</date>
    <time>18:00</time>
    <title>Some title</title>
    <location>Earth</location>
    <id>505</id>
    <category>Comedy</category>
    <description>Some description</description>
  </item>
  <item>
    <date>7/5/2013</date>
    <time>18:00</time>
    <title>Some title</title>
    <location>Earth</location>
    <id>506</id>
    <category>Comedy</category>
    <description>Some description</description>
  </item>
  <item>
    <date>7/5/2013</date>
    <time>18:00</time>
    <title>Some title</title>
    <location>Earth</location>
    <id>507</id>
    <category>Comedy</category>
    <description>Some description</description>
  </item>
</events>

eventsoverview.xsl:

<?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>
            <body style="background-color:#EFEFEF;">
                <xsl:for-each select="events/item">
                    <ul>
                        <li>
                            <h2 style="color:#9C5D00;">
                                <xsl:value-of select="title"/>
                            </h2>
                            <p>
                                <xsl:value-of select="description"/>
                            </p>
                        </li>
                    </ul>
                    <hr/>
                </xsl:for-each>
            </body>
        </html>
    </xsl:template>

</xsl:stylesheet>

Прямо сейчас этот xslt отображает краткие данные о событии. Что я хочу сделать, так это то, что когда я нажимаю на событие, оно должно отображать подробности события с использованием того же файла xml. Как мне это сделать? Можно ли это сделать с помощью нескольких файлов xslt?


person input    schedule 05.05.2013    source источник


Ответы (3)


В следующем примере я предполагаю, что щелчок по событию вызывает страницу с параметром Get-Parameter id, содержащим идентификатор события. Вам потребуется некоторая логика на стороне сервера, чтобы вставить этот идентификатор в ваш XSL (параметр eventid в моем примере). Конечно, вы также можете вставить этот параметр в XML.

Если eventid != 0 вы видите детали событий с соответствующим идентификатором. В моем примере отображаются детали события 506.

Если eventid = 0 вы видите список событий.

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

    <xsl:param name="eventid">506</xsl:param>

    <xsl:template match="/">
        <html>
            <body style="background-color:#EFEFEF;">
                <xsl:choose>
                    <xsl:when test="$eventid = 0">
                        <xsl:apply-templates/>
                    </xsl:when>
                    <xsl:when test="$eventid != 0">
                        <xsl:apply-templates select="/events/item"/>
                    </xsl:when>
                </xsl:choose>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="/events/item">
        <xsl:if test="id/text() = $eventid">
            <div>
                <h2 style="color:#9C5D00;">
                    <xsl:value-of select="title"/>
                </h2>
                <p>Description: <xsl:value-of select="description"/>
                </p>
                <p>Time: <xsl:value-of select="time"/>
                </p>
                <p>Location: <xsl:value-of select="location"/>
                </p>
                <p>ID: <xsl:value-of select="id"/></p>
                <p>Category: <xsl:value-of select="category"/>
                </p>
            </div>
            <hr/>
        </xsl:if>
    </xsl:template>

    <xsl:template match="/events">
        <xsl:for-each select="item">
            <ul>
                <li>
                    <h2 style="color:#9C5D00;">
                        <xsl:value-of select="title"/>
                    </h2>
                    <p>
                        <xsl:value-of select="description"/>
                    </p>
                    <xsl:element name="a">
                        <xsl:attribute name="href">?id=<xsl:value-of select="id"/>
                        </xsl:attribute>more</xsl:element>
                </li>
            </ul>
            <hr/>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>
person Matthias Herlitzius    schedule 05.05.2013

Если вы хотите сделать что-то более сложное, чем просто использовать один и тот же XSLT для рендеринга одного и того же XML каждый раз, инструкция обработки xml-stylesheet иссякает.

Вам нужно будет посмотреть на использование Javascript API для вызова преобразований или, что еще лучше, посмотреть на Saxon -CE, который позволяет вам написать все приложение, включая взаимодействие и обработку событий, в XSLT.

person Michael Kay    schedule 05.05.2013

С XSLT на стороне клиента я бы предложил, чтобы XSLT создавал HTML с Javascript, который скрывает и соответственно показывает детали, когда происходит событие щелчка.

person Martin Honnen    schedule 05.05.2013