我有一个XML提要,我已经将其转换为HTML用于动态Drupal页面,由 drupal.stackexchange.com 的好用户提供。 但是,问题在于XML提要列出了可能需要知道的所有内容,而我的要求是每个页面都呈现特定的信息子集。
从本质上讲,这是一个需要分解的演示时间表。
我的示例提要如下:
<track name="Track 1">
<session name="Session 1" starttime="2012-06-06 10:45" endtime="2012-06-06 12:45">
<presentation name="Presentation 1">
<author>Name 1</author>
<author>Name 2</author>
<abstract>summary of this presentation</abstract>
</presentation>
<presentation name="Presentation 2">
...presentation info
</presentation>
</session>
<session name="Session 2" starttime="2012-06-06 10:45" endtime="2012-06-06 12:45">
<presentation name="Presentation 3">
...presentation info
</presentation>
<presentation name="Presentation 4">
...presentation info
</presentation>
</session>
<session name="Session 3" starttime="2012-06-07 08:45" endtime="2012-06-07 10:45">
<presentation name="Presentation 5">
...presentation info
</presentation>
<presentation name="Presentation 6">
...presentation info
</presentation>
</session>
</track>
所以,正如你所看到的,我得到了整个程序的所有信息。 每个轨道、会话和演示文稿都在一个源中。 截至目前,我可以毫无问题地将其解析为动态页面。
从本质上讲,这就是我想得到它的内容(忽略日期时间的解析......我已经准备好了):
<h2>Track 1</h2>
<h3>Session 1</h3>
<ul>
<li><a href="presentation-1.html">Presentation 1</a></li>
<li><a href="presentation-2.html">Presentation 2</a></li>
</ul>
<h3>Sessoin 2</h3>
<ul>
<li><a href="presentation-3.html">Presentation 3</a></li>
<li><a href="presentation-4.html">Presentation 4</a></li>
</ul>
然后,单击其中一个演示文稿链接将带您进入新页面:
<h2>Presentation 1</h2>
<p>Presented by Name 1, Name 2</p>
<p>summary of this presentation</p>
所以,我这里有两个问题...我不完全知道如何以这种方式分解提要,这必须在 Drupal 6 模块中完成。 我只是在显示示例提要的片段...因为我得到的饲料很大,必须以这种方式分解。
我拥有的Drupal代码如下:
function _xml_import_generate()
{
$path = drupal_get_path('module', 'xml_import');
$xsl = new DOMDocument();
$xsl->load("{$path}/xml_import.xsl");
$xslt = new XSLTProcessor();
$xslt->importStyleSheet($xsl);
$xml = new DOMDocument();
$xml->load("myfeed.xml");
return (string) $xslt->transformToXML($xml);
}
I.对于所需的第一页:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<html>
<xsl:apply-templates/>
</html>
</xsl:template>
<xsl:template match="track">
<h2><xsl:value-of select="@name"/></h2>
<xsl:apply-templates>
<xsl:with-param name="pTrack" select=
"count(preceding-sibling::track) +1"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="session">
<xsl:param name="pTrack"/>
<h3><xsl:value-of select="@name"/></h3>
<ul>
<xsl:apply-templates>
<xsl:with-param name="pTrack" select="$pTrack"/>
<xsl:with-param name="pSess" select=
"count(preceding-sibling::session) +1"/>
</xsl:apply-templates>
</ul>
</xsl:template>
<xsl:template match="presentation">
<xsl:param name="pTrack"/>
<xsl:param name="pSess" />
<li>
<a href=
"presentation.html?track={$pTrack}&sess={$pSess}&pr={position()}">
<xsl:value-of select="@name"/>
</a>
</li>
</xsl:template>
</xsl:stylesheet>
在提供的 XML 文档上应用此转换时:
<conference>
<track name="Track 1">
<session name="Session 1" starttime="2012-06-06 10:45" endtime="2012-06-06 12:45">
<presentation name="Presentation 1">
<author>Name 1</author>
<author>Name 2</author>
<abstract>summary of this presentation</abstract>
</presentation>
<presentation name="Presentation 2">
...presentation info
</presentation>
</session>
<session name="Session 2" starttime="2012-06-06 10:45" endtime="2012-06-06 12:45">
<presentation name="Presentation 3">
...presentation info
</presentation>
<presentation name="Presentation 4">
...presentation info
</presentation>
</session>
<session name="Session 3" starttime="2012-06-07 08:45" endtime="2012-06-07 10:45">
<presentation name="Presentation 5">
...presentation info
</presentation>
<presentation name="Presentation 6">
...presentation info
</presentation>
</session>
</track>
</conference>
产生以下有用的结果:
<html>
<h2>Track 1</h2>
<h3>Session 1</h3>
<ul>
<li><a href="presentation.html?track=1&sess=1&pr=1">Presentation 1</a></li>
<li><a href="presentation.html?track=1&sess=1&pr=2">Presentation 2</a></li>
</ul>
<h3>Session 2</h3>
<ul>
<li><a href="presentation.html?track=1&sess=2&pr=1">Presentation 3</a></li>
<li><a href="presentation.html?track=1&sess=2&pr=2">Presentation 4</a></li>
</ul>
<h3>Session 3</h3>
<ul>
<li><a href="presentation.html?track=1&sess=3&pr=1">Presentation 5</a></li>
<li><a href="presentation.html?track=1&sess=3&pr=2">Presentation 6</a></li>
</ul>
</html>
二、第二页:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="track" select="1"/>
<xsl:param name="sess" select="1"/>
<xsl:param name="pr" select="1"/>
<xsl:template match="/*">
<html>
<xsl:apply-templates select=
"track[position()=$track]
/session[position()=$sess]
/presentation[position()=$pr]"/>
</html>
</xsl:template>
<xsl:template match="presentation">
<h2><xsl:value-of select="@name"/></h2>
<p>Presented by <xsl:text/>
<xsl:apply-templates select="author"/>
</p>
<p><xsl:copy-of select="abstract/node()"/></p>
</xsl:template>
<xsl:template match="author">
<xsl:if test="position() > 1">, </xsl:if>
<xsl:value-of select="."/>
</xsl:template>
</xsl:stylesheet>
在提供的 XML 文档(如上)上应用此转换时,将生成所需的正确结果:
<html>
<h2>Presentation 1</h2>
<p>Presented by Name 1, Name 2</p>
<p>summary of this presentation</p>
</html>
请注意:
每当最终用户单击第一页上的链接时,Web 服务器都必须处理此 Web 请求,并且必须调用第二个转换,将外部/全局参数传递给它,它必须从相应的查询字符串参数正确设置其值。