Я застрял, узнав, как я могу получить доступ к текущему узлу, итерации по набору узлов с помощью xsL:for-each
. Это мой XML:Доступ к текущему узлу в предикате с xsl: for-each
<events>
<event>
<date>
<year>2012</year>
<month>July</month>
</date>
<description>...</description>
</event>
<!-- more events -->
</events>
То, что я пытаюсь достичь является HTML-представление, как это:
<h2>2012</h2>
<dl>
<dt>July</dt>
<dd>One of these for every event with year=2012 and month=July</dd>
<dt>August</dt>
<!-- ... -->
</dl>
<h2>2013</h2>
<!-- ... -->
Я использую XPath-выражение, чтобы получить все различные годы, а затем перебрать их вызывая шаблон с именем year
с параметрами $year
и $events
. Получение значения для $year
легко, но я изо всех сил стараюсь найти правильные события. Следующие действия не будут работать, вероятно, потому, что .
во втором предикате относится к event
, проверенному для предиката. Но как получить доступ к year
?
<xsl:template match="events">
<xsl:for-each select="event[not(date/year=preceding-sibling::event/date/year)]/date/year">
<xsl:call-template name="year">
<xsl:with-param name="year" select="." />
<xsl:with-param name="events" select="event[date/year=.]" />
</xsl:call-template>
</xsl:for-each>
</xsl:template>
Большое спасибо заранее!
PS: Должен работать с XPath и XSLT 1.0.
Спасибо! Использование ключей снова для меня совершенно новое. Прямо сейчас я нашел другую возможность и опубликую ее как ответ ниже. Просто для моего любопытства: есть ли какое-либо прямое решение для исходного вопроса «Доступ к текущему узлу итерации»? – hielsnoppe
@hielsnoppe: Добро пожаловать. Пожалуйста, определите «прямолинейный» :). Для меня это решение является самым простым решением XSLT 1.0, о котором я знаю - иначе я бы предоставил еще один. –
Позвольте мне сказать так: ваше решение заставляет меня работать, что отлично, но не отвечает на вопрос, есть ли или нет - и в случае да, как - я могу получить доступ к вышеупомянутому свойству. Не важно, потому что это работает. :-) – hielsnoppe