После несколько назад и вперед в комментариях, кажется, как вы хотите ухватить в mapping
узла (или любой другой узел по этому вопросу), который имеет узел aid
ребенка с определенными атрибутами и значением, но нет других дочерних узлов с атрибутом @iskey
. Вы делаете это так:
//*[aid/@iskey='true' and aid/text()='bmz'][not(*[@iskey][local-name() != 'aid'])]
Предикат говорит именно, что: имеет узел aid
ребенка с этими значениями и не имеет дочерний узел с именем, отличным от aid
, что случилось бы иметь атрибут @iskey
.
Когда я запускаю этот простой тест таблицы стилей:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:copy-of select="//*[aid/@iskey='true' and aid/text()='bmz'][not(*[@iskey][local-name() != 'aid'])]"/>
</xsl:template>
</xsl:stylesheet>
от входного документа я получаю следующее в ответ:
<mapping>
<aid iskey="true">bmz</aid> <!-- I need this node -->
<account>TS</account>
</mapping>
UPDATE если вы хотите ухватить узлов что только один дочерний узел с @iskey
, вы можете сойти с рук:
//*[count(*[@iskey]) = 1]
я включил его в моей тестовой таблицы стилей и он произвел тот же ожидаемый результат:
<mapping>
<aid iskey="true">bmz</aid> <!-- I need this node -->
<account>TS</account>
</mapping>
не работает. Сначала возвращает null, а второй возвращает первый узел. Мне нужен последний узел из вышеупомянутого xml, имеющего только два тега. –
Есть три узла, которые ' bmz'.если вам нужен последний, вы можете сделать это так: '// help [@ iskey = 'true' и text() = 'bmz'] [last()]' –
'// help [@ iskey = 'true' и text() = 'bmz'] [last()] 'будет выбирать все последние узлы с указанными атрибутами своих родителей из этого xml. '// mapping [last()]/aid', вероятно, будет –