Я хотел бы, чтобы удалить последовательного дубликат узла из же родителя и который также имеет точно такое же ребенок.Как удалить этот сложный XML-дублирующий узел с помощью XSLT?
ввода Сценарий 1:
<myroot>
<nodeA id="a">
<section id="i">
<item1 id="0" method="create">
<somechild>a</somechild>
</item1>
<item1 id="1" method="create">
<otherchild>a</otherchild>
</item1>
</section>
<section id="i">
<item1 id="0" method="create"> <!-- second consecutive create, we remove this -->
<somechild>a</somechild>
</item1>
<item1 id="0" method="create"> <!-- third consecutive create, but children have different value , so we don't remove this -->
<somechild>bbb</somechild>
</item1>
<item1 id="3" method="create">
<other>xx</other>
</item1>
<item1 id="0" method="change">
<otherchild>a</otherchild>
</item1>
</section>
</nodeA>
<nodeA id="b">
<section id="i">
<item1 id="0" method="create">
<somechild>a</somechild>
</item1>
<item1 id="1" method="create">
<otherchild>a</otherchild>
</item1>
</section>
<section id="i">
<item1 id="0" method="create"> <!-- second consecutive create, we remove this -->
<somechild>a</somechild>
</item1>
<item1 id="0" method="create"> <!-- third consecutive create, but children have different value , so we don't remove this -->
<somechild>bbb</somechild>
</item1>
<item1 id="3" method="create">
<other>xx</other>
</item1>
<item1 id="0" method="change">
<otherchild>a</otherchild>
</item1>
</section>
</nodeA>
<nodeB id="b">
<section id="i">
<item1 id="0" method="create">
<somechild>a</somechild>
</item1>
<item1 id="1" method="create">
<otherchild>a</otherchild>
</item1>
</section>
<section id="i">
<item1 id="0" method="create"> <!-- second consecutive create, we remove this -->
<somechild>a</somechild>
</item1>
<item1 id="0" method="create"> <!-- third consecutive create, but children have different value , so we don't remove this -->
<somechild>bbb</somechild>
</item1>
<item1 id="3" method="create">
<other>xx</other>
</item1>
<item1 id="0" method="change">
<otherchild>a</otherchild>
</item1>
</section>
</nodeB>
</myroot>
Мой результат:
<myroot>
<nodeA id="a">
<section id="i">
<item1 id="0" method="create">
<somechild>a</somechild>
</item1>
<item1 id="1" method="create">
<otherchild>a</otherchild>
</item1>
</section>
<section id="i">
<item1 id="0" method="create">
<somechild>bbb</somechild>
</item1>
<item1 id="3" method="create">
<other>xx</other>
</item1>
<item1 id="0" method="change">
<otherchild>a</otherchild>
</item1>
</section>
</nodeA>
<nodeA id="b">
<section id="i"/>
<section id="i"/>
</nodeA>
<nodeB id="b">
<section id="i"/>
<section id="i"/>
</nodeB>
</myroot>
Ожидаемый результат:
<myroot>
<nodeA id="a">
<section id="i">
<item1 id="0" method="create">
<somechild>a</somechild>
</item1>
<item1 id="1" method="create">
<otherchild>a</otherchild>
</item1>
</section>
<section id="i">
<item1 id="0" method="create">
<somechild>bbb</somechild>
</item1>
<item1 id="3" method="create">
<other>xx</other>
</item1>
<item1 id="0" method="change">
<otherchild>a</otherchild>
</item1>
</section>
</nodeA>
<nodeA id="b">
<section id="i">
<item1 id="0" method="create">
<somechild>a</somechild>
</item1>
<item1 id="1" method="create">
<otherchild>a</otherchild>
</item1>
</section>
<section id="i">
<item1 id="0" method="create">
<somechild>bbb</somechild>
</item1>
<item1 id="3" method="create">
<other>xx</other>
</item1>
<item1 id="0" method="change">
<otherchild>a</otherchild>
</item1>
</section>
</nodeA>
<nodeB id="b">
<section id="i">
<item1 id="0" method="create">
<somechild>a</somechild>
</item1>
<item1 id="1" method="create">
<otherchild>a</otherchild>
</item1>
</section>
<section id="i">
<item1 id="0" method="create">
<somechild>bbb</somechild>
</item1>
<item1 id="3" method="create">
<other>xx</other>
</item1>
<item1 id="0" method="change">
<otherchild>a</otherchild>
</item1>
</section>
</nodeB>
</myroot>
В первом сценарии выше: только второй раз подряд создать имеет у одних и тех же детей и третьего последовательного метода create
есть разные дети, поэтому мы удаляем только второй.
Второй вход сценарий (больше вариантов):
<myroot>
<nodeB id="a">
<cell id="i">
<item2 id="1" method="create">
<otherchild>a</otherchild>
</item2>
<item2 id="0" method="create">
<otherchild>a</otherchild>
</item2>
<item2 id="1" method="modify">
<otherchild>a</otherchild>
</item2>
</cell>
<cell id="i">
<item2 id="1" method="modify"> <!-- second consecutive modify, we remove this -->
<otherchild>a</otherchild>
</item2>
<item2 id="1" method="modify"> <!-- third consecutive modify, BUT different chldren, we do NOT remove this -->
<otherchild>a</otherchild>
<somechild>aa</somechild>
</item2>
<item2 id="1" method="delete" />
<item2 id="0" method="create">
<somechild>bbb</somechild>
</item2>
<item2 id="1" method="delete" /> <!-- second consecutive delete, we remove this -->
<item2 id="3" method="create">
<other>xx</other>
</item2>
<item2 id="1" method="delete" /> <!-- third consecutive delete, we remove this -->
</cell>
</nodeB>
</myroot>
Выход:
<myroot>
<nodeB id="a">
<cell id="i">
<item2 id="1" method="create">
<otherchild>a</otherchild>
</item2>
<item2 id="0" method="create">
<otherchild>a</otherchild>
</item2>
<item2 id="1" method="modify">
<otherchild>a</otherchild>
</item2>
</cell>
<cell id="i">
<item2 id="1" method="modify">
<otherchild>a</otherchild>
<somechild>aa</somechild>
</item2>
<item2 id="1" method="delete" />
<item2 id="0" method="create">
<somechild>bbb</somechild>
</item2>
</cell>
</nodeB>
</myroot>
Не работает над этим:
<myroot>
<node1 id="a">
<section id="i">
<item1 id="0" method="start">
<somechild>a</somechild>
</item1>
<item1 id="0" method="start"> <!-- this one is successive from the previous so we eliminate -->
<somechild>a</somechild>
</item1>
<item1 id="0" method="stop"/>
<item1 id="0" method="start"> <!-- this will be treated as new starting point -->
<somechild>a</somechild>
</item1>
</section>
<section id="i">
<item1 id="0" method="start"> <!-- this one is successive from the previous so we eliminate -->
<somechild>a</somechild>
</item1>
</section>
</node1>
</myroot>
output:
<myroot>
<node1 id="a">
<section id="i">
<item1 id="0" method="start">
<somechild>a</somechild>
</item1>
<item1 id="0" method="start"> <!-- this one is successive from the previous so we eliminate -->
<somechild>a</somechild>
</item1>
<item1 id="0" method="stop"/>
</section>
<section id="i"/>
</node1>
</myroot>
The correct output should be:
<myroot>
<node1 id="a">
<section id="i">
<item1 id="0" method="start">
<somechild>a</somechild>
</item1>
<item1 id="0" method="stop"/>
<item1 id="0" method="start"> <!-- this will be treated as new starting point -->
<somechild>a</somechild>
</item1>
</section>
<section id="i" />
</node1>
</myroot>
Может кто-нибудь помог мне с этим запутанный удаление с помощью XSLT? Чрезвычайно очень.
Джон
Джон, вы можете использовать XSLT 2.0 (как реализовано Saxon или AltovaXML или XMLPrime)? У этого есть 'for-each-group' и' deep-equal'. Если вы хотите использовать XSLT 1.0, сколько дочерних узлов и имен элементов есть, они полностью произвольны? –
@MartinHonnen да, я могу использовать XSLT 2.0. Да, дочерний узел произволен, но метод только создает, изменяет и удаляет. Только узел с методом удаления не имеет дочерних элементов. – John