2016-03-31 12 views
1

私は特定の重複要素、好ましくはxsltを削除する必要があるかなり大きなxmlファイルがあります。 私は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」ごとに1だけを持つことです。 幸いにも私は1つの言語でしか動作しませんので、言語属性は常に "EN"になります

xslを適用するXMLツールをNotepad ++で使用していますが、これは任意のフリーコマンドラインツールで行うことができます。それを試してみてください。

正しい方向への助けに感謝します! :)

+0

、または:私のアプローチは、同じテキスト値と前の兄弟が存在する場合は何もしないテンプレートを書くことであろうより広い範囲、または重複のテキストをチェックする必要がありますか? –

+1

'language_translation'要素を削除するだけですか?または要素の内容に基づいて削除したいですか? –

+0

翻訳ごとに1つの翻訳しかありません。しかし、翻訳と同じ構造を持つ他の 'value'要素もあります。 – 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> 

必要に応じて、 tはlanguage属性を考慮します(重複する言語のみを削除します)。

XSLTはデフォルトで入力から何かをコピーします。 language_translations内のlanguage_translation要素が見つかると、最後に空のテンプレートが呼び出され、結果は出力されません。ただし、最初のlanguage_translationlanguage_translationsにある場合は、上記のテンプレートが優先されます(優先度に注意してください)。それだけがコピーされます。

+0

プロセッサでは、スタイルシートを適用するために使用していますが、Notepad ++でXMLツールプラグインを使用しても機能しないようです。 ( – bwedel

+0

@bwedel http://xslttest.appspot.com/で試してみました.XSLT 1.0のスタイルシートなので、正しいプロセッサであれば正しく処理できるはずです。エラーや出力が間違っていますか? –

+0

エラーはまったくありませんが、Kimさんの提案をあなたのものと組み合わせて動作するかどうかを確認しようとします:) – bwedel

0

私はあなたの質問を得るために、<language_translations>の同じテキストを含む<language_translation>を除外したいとします。内の一つだけ ` `要素 `あたり `要素があるはず

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

明らかに本文は重要ではありません。もし私が彼/彼女の質問にbwedelのコメントを誤解しているなら、あなたのテンプレートは私のスタイルシートの最後の2つを置き換えることができます。 –

+0

私はまだ本当に欲しいものが何であるか分かりません。彼は 'language'属性を無視したいと言います。しかし、彼はテキストも無視したいのですか? –

+0

そうだと思います。私が文字通り言いたいことを解釈している場合、それは親ごとに1つの 'language_translation'要素を意味します(必ずしも' language_translations'要素ではありません;複数形に注意してください)。しかし、それは "重複したテキストを削除する"という意味で解釈することができます。 –

関連する問題