Как вы создаете якорные ссылки с XML и XSL? - PullRequest
1 голос
/ 27 мая 2011

Эй, ребята, я хочу создать мини-расписание для зоопарка.

Ниже приведен макет функциональной возможности рисования.То, что мне нужно, это список по горизонтали вверх, и когда вы нажимаете на него, страница перемещается вниз к этому временному интервалу и показывает его детали.

Точно так же, как теги привязки в HTML, и мои данныехранится в XML.

enter image description here

Итак, вот мои данные xml:

<zoo>
<animal name="Lion">
<feeding-time>11:00</feeding-time>
</animal>
<animal name="Penguin">
<feeding-time>14:00</feeding-time>
</animal>
<animal name="Elephant">
<feeding-time>9:00</feeding-time>
</animal>
<animal name="Tortoise">
<feeding-time>11:00</feeding-time>
</animal>
<animal name="Ape">
<feeding-time>16:00</feeding-time>
</animal>
<animal name="Hippo">
<feeding-time>14:00</feeding-time>
</animal>
<animal name="Rattle Snake">
<feeding-time>9:00</feeding-time>
</animal>
<animal name="Flamingo">
<feeding-time>15:00</feeding-time>
</animal>
</zoo>

И моя страница XSL довольно мягкая:

<xsl:template match="/">
<html>
<head>
  <title>Real Estate Listings</title>
  <link href="style.css" rel="stylesheet" type="text/css" />
</head>
   <body>

   </body>
</html>
</xsl:template>

</xsl:stylesheet>

Я знаю, что мне нужно использовать пути локатора с использованием осей и / или группировок Meunchian - и я искал это часами, и у меня до сих пор нет никакого представления о том, что происходит.

Я знаю, что мне нужно использоватьхорошо сгенерировать функцию id-идентификатора и использовать функцию key, но, опять же, я понятия не имею, как ее реализовать - я потратил часы и часы в Google, пытаясь разобраться в этом.

Любая помощь будет утомительной.

Ответы [ 2 ]

2 голосов
/ 27 мая 2011

Это преобразование :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:key name="kTimeByVal" match="feeding-time"
  use="."/>

 <xsl:key name="kAnimalByTime" match="@name"
  use="../feeding-time"/>

 <xsl:template match="/">
  <xsl:apply-templates/>

  <xsl:apply-templates mode="group"/>
 </xsl:template>

 <xsl:template match=
  "feeding-time[generate-id()
               =
                generate-id(key('kTimeByVal',.)[1])
               ]
  ">

  <a href="#{generate-id()}">
  <xsl:value-of select="."/>
  </a>
  <xsl:text> </xsl:text>
 </xsl:template>

 <xsl:template mode="group" match=
  "feeding-time[generate-id()
               =
                generate-id(key('kTimeByVal',.)[1])
               ]
  ">

  <br /><p id="{generate-id()}"><xsl:text/>

  <b><xsl:value-of select="."/> Feeding Time for:</b></p>

  <xsl:apply-templates select="key('kAnimalByTime', .)"/>
 </xsl:template>

 <xsl:template match="@name">
  <br /><xsl:value-of select="."/>
 </xsl:template>

 <xsl:template match="text()"/>
 <xsl:template mode="group" match="text()"/>
</xsl:stylesheet>

применительно к предоставленному документу XML :

<zoo>
    <animal name="Lion">
        <feeding-time>11:00</feeding-time>
    </animal>
    <animal name="Penguin">
        <feeding-time>14:00</feeding-time>
    </animal>
    <animal name="Elephant">
        <feeding-time>9:00</feeding-time>
    </animal>
    <animal name="Tortoise">
        <feeding-time>11:00</feeding-time>
    </animal>
    <animal name="Ape">
        <feeding-time>16:00</feeding-time>
    </animal>
    <animal name="Hippo">
        <feeding-time>14:00</feeding-time>
    </animal>
    <animal name="Rattle Snake">
        <feeding-time>9:00</feeding-time>
    </animal>
    <animal name="Flamingo">
        <feeding-time>15:00</feeding-time>
    </animal>
</zoo>

дает в точности нужный результат:

<a href="#d0e5">11:00</a> 
<a href="#d0e11">14:00</a> 
<a href="#d0e17">9:00</a> 
<a href="#d0e29">16:00</a> 
<a href="#d0e47">15:00</a> 
<br/>
<p id="d0e5">
   <b>11:00 Feeding Time for:</b>
</p>
<br/>Lion<br/>Tortoise<br/>
<p id="d0e11">
   <b>14:00 Feeding Time for:</b>
</p>
<br/>Penguin<br/>Hippo<br/>
<p id="d0e17">
   <b>9:00 Feeding Time for:</b>
</p>
<br/>Elephant<br/>Rattle Snake<br/>
<p id="d0e29">
   <b>16:00 Feeding Time for:</b>
</p>
<br/>Ape<br/>
<p id="d0e47">
   <b>15:00 Feeding Time for:</b>
</p>
<br/>Flamingo

И он отображается в браузере именно так, как хотел, и имеет желаемое поведение (щелчок по ссылке):

11: 00 14:00 9:00 16:00 15:00

11: 00 Время кормления для:


Lion
Tortoise

14: 00 Время кормления для:


Penguin
Hippo

9: 00 Время кормления для:


Слон
Гремучая змея

16: 00 Время кормления для:


Ape

15: 00 Время кормления для:


Flamingo

Объяснение : мюнхенская группировка, использующая generate-id() для генерации уникальных идентификаторов для использования в качестве якорей, используя ключи.

0 голосов
/ 27 мая 2011

Muenchian группировка использует ключ, определенный на корневом уровне листа XSLT, который позволяет функции key возвращать список всех элементов, которые соответствуют заданным критериям, а затем выбирает первый элемент из этого списка. Например:

<xsl:key name="feedingTime" match="*" use="feeding-time" />

Это позволяет вам вызывать key('feedingTime','11:00'), чтобы получить список всех элементов, которые имеют элемент feeding-time со значением 11:00.

Вы можете использовать это в шаблоне с функцией generate-id(), которая возвращает уникальное значение каждого идентификатора. Вы делаете это путем сравнения идентификатора элемента, который вы сейчас обрабатываете, с идентификатором первого элемента в списке всех элементов с одинаковым значением feeding-time. Как это:

<xsl:if test="generate-id(feeding-time) = generate-id(key('feeding-time',feeding-time)[1])">
  <!-- generate output -->
</xsl:if>

Или вы можете использовать одно и то же условие в сопоставлении с шаблоном и использовать один и тот же ключ для перебора списка animal узлов с текущим временем подачи:

<xsl:template match="animal[generate-id() = generate-id(key('feedingTime',feeding-time)[1])]">
  <!-- output a heading here, current node is first animal node with each feeding-time -->
  <xsl:for-each select="key('feedingTime',feeding-time)">
    <!-- output each animal here -->
  </xsl:for-each>
</xsl:template>

Если вы сделаете это, вам нужно будет включить пустой шаблон, например, такой: <xsl:template match="animal" /> для обработки оставшихся animal элементов, отбрасывая их; вы уже работали с ними в цикле for-each вышеприведенного шаблона.

Вы можете использовать режимы шаблонов, чтобы обрабатывать список отдельно для ссылок и содержимого ниже, например:

<xsl:key name="feedingTime" match="*" use="feeding-time" />

<xsl:template match="zoo">
  <xsl:apply-templates mode="links" />
  <xsl:apply-templates mode="content" />
</xsl:template>

<xsl:template match="animal[generate-id() = generate-id(key('feedingTime',feeding-time)[1])]" mode="links">
  <a href="#time_{feeding-time}">
    <xsl:value-of select="feeding-time" />
  </a>
</xsl:template>

<xsl:template match="animal[generate-id() = generate-id(key('feedingTime',feeding-time)[1])]" mode="content">
  <p id="time_{feeding-time}">
    <xsl:value-of select="concat(feeding-time,' Feeding time for:')" />
  </p>
  <ul>
    <xsl:for-each select="key('feedingTime',feeding-time)">
      <li>
        <xsl:value-of select="@name" />
      </li>
    </xsl:for-each>
  </ul>
</xsl:template>

<xsl:template match="animal" mode="links" />
<xsl:template match="animal" mode="content" />

Два шаблона внизу предназначены для обработки всех элементов animal, которые не были обработаны предыдущими (т. Е. Вторым и последующим элементом animal для каждого времени подачи). Я не занимался форматированием здесь, но, надеюсь, он должен продемонстрировать методы, которые должны вам помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...