Используйте XSLT для удаления любых дублирующих узлов, только если они содержат одинаковое содержимое - PullRequest
1 голос
/ 01 июля 2010

У меня есть следующий xml:

<?xml version="1.0" encoding="UTF-8"?>   
<SomeName>   
  <NodeA> 
    DataA 
 </NodeA>   
 <NodeA> 
    DataB 
 </NodeA>   
  <NodeA> 
    DataA 
 </NodeA>   
  <AnotherNode> 
    DataA 
 </AnotherNode> 
  <AnotherNode> 
    DataC 
 </AnotherNode> 
  <AnotherNode> 
    DataC 
 </AnotherNode> 
 <SingleNode> 
    DataA 
 </SingleNode> 

И мне нужно проанализировать xml, удалив все узлы с одинаковыми именами и содержимым. Проблема в том, что дубликаты более или менее разбросаны по всему документу, и у меня нет списка имен узлов или конкретного содержимого, от которого я хочу избавиться.

В основном мой вывод должен выглядеть так:

<?xml version="1.0" encoding="UTF-8"?>   
<SomeName>   
  <NodeA> 
    DataA 
 </NodeA>   
 <NodeA> 
    DataB 
 </NodeA>   
 <AnotherNode> 
    DataA 
 </AnotherNode> 
  <AnotherNode> 
    DataC 
 </AnotherNode>  
 <SingleNode> 
    DataA 
 </SingleNode> 

Кто-нибудь получил какой-нибудь умный XSLT?

Спасибо!

1 Ответ

2 голосов
/ 01 июля 2010

При правильном вводе:

<SomeName>
    <NodeA>DataA</NodeA>
    <NodeA>DataB</NodeA>
    <NodeA>DataA</NodeA>
    <AnotherNode>DataA</AnotherNode>
    <AnotherNode>DataC</AnotherNode>
    <AnotherNode>DataC</AnotherNode>
    <SingleNode>DataA</SingleNode>
</SomeName>

Эта таблица стилей:

<xsl:stylesheet
          xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
          version="1.0">
    <xsl:output indent="yes"/>
    <xsl:key name="nodes" match="SomeName/*" use="concat(name(),'&amp;',.)"/>
    <xsl:template match="SomeName">
        <xsl:copy>
            <xsl:copy-of select="*[count(.|key('nodes',concat(name(),'&amp;',.))[1])=1]"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

Результат:

<SomeName>
<NodeA>DataA</NodeA>
<NodeA>DataB</NodeA>
<AnotherNode>DataA</AnotherNode>
<AnotherNode>DataC</AnotherNode>
<SingleNode>DataA</SingleNode>
</SomeName>

С «Преобразованием идентичности»:

<xsl:stylesheet
          xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
          version="1.0">
    <xsl:output indent="yes"/>
    <xsl:key name="nodes" match="SomeName/*" use="concat(name(),'&amp;',.)"/>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="SomeName/*[count(.|key('nodes',concat(name(),'&amp;',.))[1])!=1]"/>
</xsl:stylesheet>

Редактировать : Добавлен пример с "преобразованием идентичности" на случай, если потребуется дополнительная работа.

Примечание : мюнхенский метод группировки.

...