在Drupal中向我的XSLT添加链接功能


Adding linking functionality to my XSLT in Drupal

我有一个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}&amp;sess={$pSess}&amp;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&amp;sess=1&amp;pr=1">Presentation 1</a></li>
      <li><a href="presentation.html?track=1&amp;sess=1&amp;pr=2">Presentation 2</a></li>
   </ul>
   <h3>Session 2</h3>
   <ul>
      <li><a href="presentation.html?track=1&amp;sess=2&amp;pr=1">Presentation 3</a></li>
      <li><a href="presentation.html?track=1&amp;sess=2&amp;pr=2">Presentation 4</a></li>
   </ul>
   <h3>Session 3</h3>
   <ul>
      <li><a href="presentation.html?track=1&amp;sess=3&amp;pr=1">Presentation 5</a></li>
      <li><a href="presentation.html?track=1&amp;sess=3&amp;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 请求,并且必须调用第二个转换,将外部/全局参数传递给它,它必须从相应的查询字符串参数正确设置其值。