具有多个XSLT样式表的XML

时间:2013-05-05 09:03:21

标签: xml xslt

我有一个用xslt文件打开的xml文件:

<?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文件来完成吗?

3 个答案:

答案 0 :(得分:2)

在下面的示例中,我假设单击某个事件会调用带有Get-Parameter id的页面,其中包含事件的ID。您需要一些服务器端逻辑才能将此ID插入XSL(在我的示例中为参数eventid)。当然,您也可以将此参数插入XML。

如果eventid != 0您看到具有相应ID的事件的详细信息。在我的示例中,将显示事件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>

答案 1 :(得分:2)

如果你想做一些比仅使用相同的XSLT每次渲染相同XML更复杂的事情,xml-stylesheet处理指令就会失去动力。

您需要查看使用Javascript API来调用转换 - 或者更好的是,查看Saxon-CE,它允许您编写整个应用程序,包括XSLT中的交互和事件处理。

答案 2 :(得分:0)

对于客户端XSLT,我建议让XSLT使用Javascript创建HTML,隐藏时分别显示单击事件发生时的详细信息。