Объединение результатов применения шаблонов с каждой группой (или альтернативного решения проблемы) - PullRequest
1 голос
/ 15 августа 2011

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

Однако мне нужно расширить это решение. Помимо списка, мне нужно меню перехода. Поэтому я должен извлечь первую букву каждого заголовка (включая альтернативные заголовки), взять эти буквы и отобразить их в верхней части списка. Каждое письмо является ссылкой на якорь на странице. В списке сначала может быть представлена ​​буква «A», затем все статьи, начинающиеся с «A», затем «B», за которыми следуют все статьи, начинающиеся с «B», и так далее. Те буквы, которые не являются первыми буквами любого названия, отображаться не должны.

У меня есть старое решение о том, как получить меню перехода, но оно работает только тогда, когда мне нужно извлечь заголовок из одного места в исходном XML. Альтернативные названия на пару уровней глубже основного названия. Для старого решения я использовал:

<div class="jumpmenu">
  <xsl:for-each-group group-by="substring(title, 1,1)" select="content">
    <xsl:sort order="ascending" select="substring(title, 1,1)"/>
    <a href="{$url}#{substring(title, 1,1)}"><xsl:value-of select="substring(title, 1,1)"/></a><xsl:text> </xsl:text>
  </xsl:for-each-group>
</div>

Но, как уже упоминалось, он не учитывает альтернативные названия. Я могу получить первую букву всего заголовка (включая альтернативы), используя это:

<xsl:apply-templates select="content/title|content/contentdata/alternativetitles/alternativetitle" mode="jumpmenu">
  <xsl:sort select="string(.)" />            
</xsl:apply-templates>

Он просто получает первую букву всех заголовков и сортирует их. Я пытался найти способы объединить эти два (для каждой группы и применить шаблоны), но без удачи. Есть идеи, как это сделать. Пример исходного XML выглядит следующим образом:

<result>
  <element>
    <title>ATitle 1</title>
    <alternative>
      <alternativeTitle>Title 5<alternativeTitle>
    </alternative>
    <data>
      ...
    </data>
  </element>

  <element>
    <title>CTitle 3</title>
    <alternative>
      <alternativeTitle>BTitle 2<alternativeTitle>
      <alternativeTitle>Title 4<alternativeTitle>
    </alternative>
    <data>
      ...
    </data>
  </element>
</result>

Мой желаемый результат - что-то вроде:

A  B  C  T          (links to their respective anchors)
A         (anchor)
ATITLE 1 (which is also a link to the full article)
B         (anchor)
BTITLE 2 (which is also a link to the full article)
C         (anchor)
CTITLE 3 (which is also a link to the full article)
T         (anchor)
TITLE 4 (which is also a link to the full article)
TITLE 5 (which is also a link to the full article)

Решение этой проблемы, вероятно, поможет мне с другой проблемой, но я представлю ее, если у кого-то тоже есть идеи для этого. Статьи, имеющие альтернативные заголовки, перечислены под той же буквой, что и первая буква основного заголовка. Поэтому, учитывая приведенный выше пример, "BTitle 2" указан в списке "C".

Извините за длинный пост, я не нашел способа сделать его короче и все же быть точным. Заранее спасибо!

РЕДАКТИРОВАТЬ: Это код, который я до сих пор на второй части проблемы:

<xsl:for-each-group group-by="substring(title, 1,1)" select="content">
  <xsl:sort order="ascending" select="substring(title, 1,1)"/>
  <xsl:apply-templates mode="overskrift" select="."/>
  <xsl:apply-templates select="current-group()/title|current-group()/contentdata/alternativetitles/alternativetitle">
    <xsl:sort select="string(.)"/>
  </xsl:apply-templates>
</xsl:for-each-group>

В этом коде будут перечислены все заголовки, но перечислены альтернативные заголовки, основанные на той же первой букве, что и основной заголовок статьи.

1 Ответ

1 голос
/ 15 августа 2011

Ну, почему бы вам просто не использовать

<xsl:for-each-group select="content/title|content/contentdata/alternativetitles/alternativetitle" group-by="substring(., 1, 1)">
   <xsl:sort select="current-grouping-key()"/>
   <a href="{$url}#{current-grouping-key()}"><xsl:value-of select="current-grouping-key()"/></a><xsl:text> </xsl:text>

</xsl:for-each-group>

? Вы должны поместить этот код в шаблон, соответствующий родительскому элементу этого элемента содержимого (я не уверен, какое имя он имеет, поскольку ваши выражения пути и отправленный образец XML не совпадают).

...