Как удалить дубликаты узлов XML с помощью XSLT

У меня очень длинный XML-файл, например

<Root>
   <ele1>
      <child1>context1</child1>
      <child2>test1</child2>
      <child1>context1</child1>
   </ele1>

   <ele2>
      <child1>context2</child1>
      <child2>test2</child2>
      <child1>context2</child1>
   </ele2>
   <ele3>...........<elen>
</Root>

Теперь я хочу удалить все вторые <child1>в каждом <ele>с помощью xslt, это возможно? Результат будет таким:

<Root>
   <ele1>
      <child1>context1</child1>
      <child2>test1</child2>
   </ele1>

   <ele2>
      <child1>context2</child1>
      <child2>test2</child2>
   </ele2>
       <ele3>...........<elen>
</Root>

Спасибо, BR

Аллен

10.12.2008 11:00:07
3 ОТВЕТА

Ваш xml и вопрос вроде неясны, но то, что вы ищете, обычно называют методом группирования по Мюнхену - это еще один способ запроса отдельных узлов. С помощью соответствующих клавиш это можно сделать очень эффективно.

-1
10.12.2008 11:07:24
Это скорее подсказка, чем ответ. Людям нужны серьезные и ответственные ответы.
Dimitre Novatchev 14.04.2009 13:20:44
@annakata Этот вопрос о результатах поиска, с ~ 14k просмотров. Я рекомендую убрать невежливые комментарии здесь.
wizzwizz4 27.10.2018 17:44:35

Этот вопрос требует немного более подробного ответа, чем просто указание на хороший источник мюнхенской группировки .

Причина в том, что необходимая группировка требует идентификации как имен всех дочерних элементов элемента «ele [SomeString]», так и их родительских элементов . Такая группировка требует определения ключа, который уникальным образом определяется обоими уникальными источниками, обычно посредством конкатенации.

Это преобразование :

<xsl: stylesheet version = "1.0"
 XMLNS: XSL = "http://www.w3.org/1999/XSL/Transform">
 <xsl: output omit-xml-объявление = "да" отступ = "да" />

 <xsl: key name = "kElByName" match = "*"
      use = "concat (generate-id (..), '+', name ())" />

    <xsl: template match = "node () | @ *">
      <XSL: копия>
        <xsl: apply-templates select = "node () | @ *" />
      </ XSL: копия>
    </ XSL: шаблон>

    <xsl: template match = "* [начинается с (name (), 'ele')]">
      <XSL: копия>
        <xsl: copy-of select = "@ *" />
        <xsl: apply-templates select =
         «* [Сгенерировать-идентификатор ()
           знак равно
            генерировать-идентификатор (ключ ( 'kElByName',
                        concat (generate-id (..), '+', name ())
                        ) [1])
            ]»
         />
      </ XSL: копия>
    </ XSL: шаблон>
</ XSL: таблицы стилей>

при применении к этому документу XML :

<Root>
    <Ele1>
        <Child1> context1 </ child1>
        <Child2> test1 </ child2>
        <Child1> context1 </ child1>
    </ Ele1>
    <Ele2>
        <Child1> context2 </ child1>
        <Child2> test2 </ child2>
        <Child1> context2 </ child1>
    </ Ele2>
    <Ele3>
        <Child2> context2 </ child2>
        <Child2> test2 </ child2>
        <Child1> context1 </ child1>
    </ Ele3>
</ Root>

дает желаемый результат :

<Root>
    <Ele1>
        <Child1> context1 </ child1>
        <Child2> test1 </ child2>
    </ Ele1>
    <Ele2>
        <Child1> context2 </ child1>
        <Child2> test2 </ child2>
    </ Ele2>
    <Ele3>
        <Child2> context2 </ child2>
        <Child1> context1 </ child1>
    </ Ele3>
</ Root>
4
11.12.2008 02:50:32

Если предоставленный ФП XML представляет его / ее вопрос (а 2-й <child1> внутри каждого <ele*>элемента должен быть удален), то мюнхенская группировка не нужна:

XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output omit-xml-declaration="no" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <!-- Identity Template: copies everything as-is -->
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <!-- Remove the 2nd <child1> element from each <ele*> element -->
  <xsl:template match="*[starts-with(name(), 'ele')]/child1[2]" />

</xsl:stylesheet>

При запуске с предоставленным XML:

<?xml version="1.0" encoding="UTF-8"?>
<Root>
  <ele1>
    <child1>context1</child1>
    <child2>test1</child2>
    <child1>context1</child1>
  </ele1>
  <ele2>
    <child1>context2</child1>
    <child2>test2</child2>
    <child1>context2</child1>
  </ele2>
</Root>

... желаемый результат получается:

<?xml version="1.0" encoding="UTF-8"?>
<Root>
  <ele1>
    <child1>context1</child1>
    <child2>test1</child2>
  </ele1>
  <ele2>
    <child1>context2</child1>
    <child2>test2</child2>
  </ele2>
</Root>
2
20.05.2012 02:33:23