Я хочу, чтобы иметь возможность выбрать первый элемент XML из набора, который соответствует значениям атрибута. Для того, чтобы объяснить больше, предположим, что мы имеем следующий XML:Выберите только первый элемент из списка, соответствующего значению атрибута
<events>
<event date="2013-06-17">
<person first="Joe" last="Bloggs" />
<person first="John" last="Smith" />
</event>
<event date="2013-01-29">
<person first="Jane" last="Smith" />
<person first="John" last="Smith" />
</event>
<event date="2012-09-03">
<person first="Joe" last="Bloggs" />
<person first="John" last="Doe" />
</event>
<event date="2012-04-05">
<person first="Jane" last="Smith" />
<person first="John" last="Smith" />
<person first="John" last="Doe" />
</event>
<event>
Я хочу, чтобы выбрать уникальный набор человека элемент, соответствующий на первых и последних атрибутов, то есть результирующий набор будет выглядеть следующим образом:
<person first="Joe" last="Bloggs" />
<person first="John" last="Doe" />
<person first="Jane" last="Smith" />
<person first="John" last="Smith" />
Есть целый ряд решений, все из которых являются вариации на эту тему:
<xsl:for-each select="//person">
<xsl:if test="not(preceding::person[ @first = current()/@first and @last = current()/@last ])">
<xsl:apply-templates select="." />
</xsl:if>
</xsl:for-each>
Тем не менее, мне кажется, что я должен быть в состоянии включить тест из xsl:if
в качестве предиката при выборе из xsl:for-each
, например.
<xsl:apply-templates select="//person[ not(preceding::person[ @first = current()/@first and @last = current()/@last ]) ]" />
Конечно, хотя, функция current()
не нравится, но я просто интересно, если кто-нибудь знает, как это может быть сделано в одном операторе XPath?
Можете ли вы использовать XSLT 2.0 или XSTL 1.0? В XSLT 2.0 вы можете использовать элемент ** xsl: for-each-group **. В XSLT 1.0 вы использовали бы технологию, известную как Muenchian Grouping. –
Я могу использовать XSL 2.0, но, хотя для каждой группы работает немного аккуратно, чем то, что я сейчас делаю, она не решает проблему: как указать выбор как единую инструкцию XPath, которая может быть использована, например, в вызове apply-templates. – rumplestiltzkin