2016-03-31 3 views
1

У меня есть довольно большие файлы xml, в которых мне нужно удалить определенные повторяющиеся элементы, желательно с xslt. Я пробовал предлагаемые решения here, но без везения.Удаление повторяющегося элемента из xml

Входной XML может выглядеть следующим образом

<workspace version="54"> 
<rootelement> 
<description>Nice product</description> 
<options> 
<values> 
..... 
<values> 
</options> 
<product_structure> 
<variable name="A"> 
<description>Feature A</description> 
... 
<language_translations> 
<language_translation language="EN">Include big red button</language_translation> 
<language_translation language="EN">Include big red button</language_translation> 
<language_translation language="EN">Include big red button</language_translation> 
<language_translation language="EN">Include big red button</language_translation> 
<language_translation language="EN">Include big red button</language_translation> 
<language_translation language="EN">Include big red button</language_translation> 
.... 
</language_translations> 
... 

То, что я пытаюсь достичь, чтобы иметь один и только на «/ RootElement/product_structure/переменной/language_translations». К счастью, я использую только один язык, поэтому атрибут языка всегда будет «EN»

В настоящее время я использую XML-инструменты в Notepad ++ для применения xsl, но если это можно сделать с помощью любого бесплатного инструмента командной строки, я готов попробовать это тоже.

Любая помощь в правильном направлении оценивается! :)

+0

Должны ли быть только один '' элемент на элемент '', или в больший объем, или вам нужно проверить текст на дубликаты? –

+1

Вы просто хотите удалить любой второй, третий и т. Д. Элемент 'language_translation'? Или вы хотите устранить на основе содержимого элемента? –

+0

Только один перевод на переводы, да. Но будет много переменных элементов с переводами, а также других элементов «значения» с той же структурой переводов. – bwedel

ответ

0

Следующий XSLT достигнет того, что я сейчас считаю, что вы просите. Пожалуйста, обратите внимание на комментарии по вашему вопросу, поэтому я могу настроить это, если я ошибаюсь.

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="xml" /> 

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

    <xsl:template match="language_translations/language_translation[1]" priority="2"> 
     <xsl:copy> 
       <xsl:apply-templates select="node()|@*" /> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="language_translations/language_translation"> 
    </xsl:template> 

</xsl:stylesheet> 

При применении этого входного XML (который я модифицированном немного для полноты и читаемости) ...

<workspace version="54"> 
    <rootelement> 
     <description>Nice product</description> 
     <options> 
      <values> 
..... 
      </values> 
     </options> 
     <product_structure> 
      <variable name="A"> 
       <description>Feature A</description> 
... 
       <language_translations> 
        <language_translation language="EN">Include big red button</language_translation> 
        <language_translation language="EN">Include big red button</language_translation> 
        <language_translation language="EN">Include big red button</language_translation> 
        <language_translation language="EN">Include big red button</language_translation> 
        <language_translation language="EN">Include big red button</language_translation> 
        <language_translation language="EN">Include big red button</language_translation> 
.... 
       </language_translations> 
      </variable> 
     </product_structure> 
    </rootelement> 
</workspace> 

Он производит этот выход:

<?xml version="1.0" encoding="UTF-8"?><workspace version="54"> 
    <rootelement> 
     <description>Nice product</description> 
     <options> 
      <values> 
..... 
      </values> 
     </options> 
     <product_structure> 
      <variable name="A"> 
       <description>Feature A</description> 
... 
       <language_translations> 
        <language_translation language="EN">Include big red button</language_translation> 





.... 
       </language_translations> 
      </variable> 
     </product_structure> 
    </rootelement> 
</workspace> 

При необходимости я также могу предоставить версию tha t учитывает атрибут language (удаление только повторяющихся языков).

XSLT по умолчанию будет копировать что-либо из ввода. Если он встречает элемент language_translation в пределах language_translations, он вызывает пустой шаблон в конце, в результате чего нет выхода. Однако для сначалаlanguage_translation в пределах language_translations, шаблон выше имеет приоритет (обратите внимание на приоритет). Так что только это копируется.

+0

С процессором, который вы используете для применения таблицы стилей, я не могу заставить его работать с помощью плагина XML Tools в Notepad ++: ( – bwedel

+0

@bwedel Я пробовал это в http://xslttest.appspot.com/. Это таблица стилей XSLT 1.0, так что любой правильный процессор должен иметь возможность обрабатывать ее правильно. Вы получаете ошибку или неправильный вывод? –

+0

Отсутствие ошибки вообще, но она попытается совместить предложение Кима с вашим и посмотреть, работает ли он :) – bwedel

0

Так как я получаю ваш вопрос, вы хотите устранить 2-й, 3-й и т. Д. <language_translation>, содержащий один и тот же текст в том же <language_translations>. Мой подход должен был бы написать шаблон, который ничего не делает, если существует предыдущий родственный с тем же текстовым значением:

<xsl:template match="language_translation[text()=preceding-sibling::language_translation/text()]"/> 
+0

По-видимому, текст не имеет значения. Если я неверно интерпретирую комментарий Бведеля по его/ее вопросу, ваш шаблон может заменить последние два в моей таблице стилей. –

+0

Я до сих пор не уверен, что действительно хочет битвель. Он говорит, что хочет игнорировать атрибут 'language'. Но хочет ли он и игнорировать текст? –

+0

Думаю, да, да. Если я интерпретирую буквально то, что он говорит, то это означает один элемент 'language_translation' для каждого родителя (не обязательно элемент' language_translations', обратите внимание на множественное число). Но это можно интерпретировать как означающее «удаление дубликатов текстов». –

Смежные вопросы