У меня есть некоторый XML, который семантически аналогичен приведенному ниже:
<root>
<parent>
<a>
<b t="0"/>
</a>
<a>
<b t="0"/>
</a>
<a so="2">
<b t="1">
<c n="x"/>
</b>
</a>
<a>
<b t="2">
<c n="x"/>
</b>
</a>
<a>
<b t="1">
<c n="y"/>
</b>
</a>
<a so="3">
<b t="2">
<c n="z"/>
</b>
</a>
</parent>
<parent>
<a so="1">
<b t="2">
<c n="x"/>
</b>
</a>
<a so="4">
<b t="1">
<c n="z"/>
</b>
</a>
</parent>
</root>
И у меня есть шаблон, который применяется ко всем a
элементам:
<xsl:template match="a" mode="whatever">
do some nice stuff with the content of a
</xsl:template>
У меня есть некоторыешаблоны, которые переопределяют поведение, ничего не делая, если выполняются определенные условия. например:
<xsl:template match="a[@t='0'][preceding-sibling:a[@t='0']" mode="whatever">
<!-- ignore this node entirely -->
</xsl:template>
(обратите внимание, в приведенном выше примере порядок документов имеет значение, в вопросе ниже он не имеет значения)
Что прекрасно работает, однако теперь мне нужно сделать что-то более сложное,Я хочу игнорировать 4-й a
элемент в приведенном выше примере xml, учитывая, что выполняются следующие условия:
b/@t="2"
- есть некоторые другие
a
в пределахтот же родительский элемент, где b/@t="1"
- значения
b/c/@n
одинаковы для обоих элементов a
.
В примере xml последний узел не должен совпадатьпо этому правилу, так как значения @n разные.
Мне все равно, в каком порядке находятся a
узлы, или между ними есть другие вещи. Однако я могу утверждать, что узлы будут в указанном порядке, без промежуточных узлов, если это необходимо.
Возможно, есть другой способ добиться этого, кроме переопределения шаблонов, однако для аккуратности кода ядействительно ищу решение на основе шаблонов, если оно существует.
В настоящее время я использую xmlstarlet, который не поддерживает XSLT2.0 или XPATH2.0, я могу исследовать другие механизмы, но предпочел бы придерживаться того, чтоЯ имею, если это вообще возможно.
NB Узел в разных parent
узлах не должен влиять друг на друга - например, на узел, помеченный @so=1
, не должно влиять присутствие узла, помеченного @so=2
, поскольку онинаходятся в разных родительских узлах. Аналогично для @so=3
и @so=4
. В примере ни один из этих узлов не должен совпадать