Я пытаюсь выбрать все узлы, которые 1) идут после узла с определенным свойством и 2) сами имеют определенное свойство.Поэтому, если бы у меня был следующий XML:
<node id="1"><child attr="valueOfInterest"/></node>
<node id="2"><child attr="boringValue"/></node>
...
<node id="3"><child attr="valueOfInterest"/></node>
<node id="4"><child attr="boringValue"/></node>
<node id="5"><child attr="boringValue"/></node>
<node id="6"><child attr="boringValue"/></node>
...
Мой XSLT проходит через каждый тег node
.На каждом node
я хочу, чтобы он выбирал все предыдущие node
с, которые произошли с самого последнего node
с child
, attr
которого был valueOfInterest
.Поэтому, если бы я был на узле № 2, я бы хотел установить пустой узел.Если бы я был на узле № 6, я бы хотел выбрать узлы № 4 и 5. В настоящее время у меня есть следующий XSLT:
<xsl:variable name="prev_vals"
select="preceding-sibling::node/child[@attr = $someValueICareAbout]/@attr"/>
Так что этот XSLT получает все предшествующие attr
значения, которые являютсяконкретное значение.Как получить только те предшествующие значения attr
, которые находятся в node
с, которые следуют после самого последнего node
, у которого child
имеет конкретное значение attr
(т. Е. "ValueOfInterest")?Атрибут id
в тегах node
не обязательно будет увеличиваться, поэтому мы не можем сравнивать его с этим.
Редактировать: Я думал, что они могут быть полезны:
<xsl:variable name="prev_children_of_interest"
select="preceding-sibling::node/child[@attr != $someValueICareAbout]"/>
<xsl:variable name="mru_child_of_interest"
select="$prev_children_of_interest[count($prev_children_of_interest)]"/>
Итак, это все предыдущие теги child
с attr=valueOfInterest
, а затем самый последний использованный (ближайший к текущему узлу) тег child
, имеющий атрибут, который я ищу.Из mru_child_of_interest
мы можем найти самый последний использованный тег parent
, но как нам тогда искать узлы, которые идут после этого тега?