Я получил список статей, отсортированных по названию. В дополнение к заголовку "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>
В этом коде будут перечислены все заголовки, но перечислены альтернативные заголовки, основанные на той же первой букве, что и основной заголовок статьи.