我有一个用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文件来完成吗?
答案 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,隐藏时分别显示单击事件发生时的详细信息。