Мой исходный xml имеет разные узлы с тем же именем тега. Я хочу преобразовать этот xml в xml, где каждый дочерний узел уникален, например. это мой XML:Скопируйте только первый дочерний элемент на вывод
<?xml version="1.0" encoding="utf-16"?>
<shiporder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" orderid="orderid1">
<orderperson>orderperson1</orderperson>
<shipto>
<name>name1</name>
<address>address1</address>
<city>city1</city>
<country>country1</country>
</shipto>
<item>
<title>title1</title>
<note>note1</note>
<note>1</note>
</item>
<item>
<title>title2</title>
<note>note2</note>
</item>
</shiporder>
Результат после моей трансформации должен выглядеть следующим образом:
<?xml version="1.0" encoding="utf-16"?>
<shiporder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" orderid="orderid1">
<orderperson>orderperson1</orderperson>
<shipto>
<name>name1</name>
<address>address1</address>
<city>city1</city>
<country>country1</country>
</shipto>
<item>
<title>title1</title>
<note>note1</note>
</item>
</shiporder>
Я пытался выбрать первый ребенок с помощью *[1]
, если есть более чем один раз с таким же именем тега, но до сих пор Я не получаю правильный результат:
<xsl:template match="/">
<xsl:copy-of select="//*[1]"/>
</xsl:template>
thx за исключением вложенного шаблона. Не могли бы вы добавить некоторые пояснения к циклу шаблона, который определяется '* [previous-sibling :: * [node-name (.) Eq node-name (current())]]'? – StellaMaris
Образец '* [previous-sibling :: * [node-name (.) Eq node-name (current())]]' соответствует любому элементу, у которого есть предшествующий элемент сиблинга того же квалифицированного имени, то есть имеет предшествующий элемент сиблинга того же локального имени в том же пространстве имен. –
Но тогда я не понимаю, почему он не копирует все другие ноты с именем «item», у которого есть предыдущий брат? – StellaMaris