Как удалить дубликаты узлов XML с помощью XSLT - PullRequest
3 голосов
/ 10 декабря 2008

У меня очень длинный 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

Allen

Ответы [ 3 ]

4 голосов
/ 11 декабря 2008

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

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

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

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

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

    <xsl:template match="node()|@*">
      <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
      </xsl:copy>
    </xsl:template>

    <xsl:template match="*[starts-with(name(), 'ele')]">
      <xsl:copy>
        <xsl:copy-of select="@*"/>
        <xsl:apply-templates select=
         "*[generate-id()
           =
            generate-id(key('kElByName',
                        concat(generate-id(..), '+',name())
                        )[1])
            ]"
         />
      </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

при применении к этому документу 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>
2 голосов
/ 20 мая 2012

Если предоставленный ФП 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>
0 голосов
/ 10 декабря 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...