3

XSLTを初めて使用し、単純なXMLファイルから重複を削除する際に問題が発生します。それを手に入れるために多くの時間を費やしましたが、それは決して正しくありません。ソースファイルは次のとおりです。

<?xml version="1.0" encoding="UTF-16"?>
<language>
    <lang name="welcome">welcom</lang>
    <lang name="open">Open</lang>
    <lang name="close">Close</lang>
    <lang name="welcome">Welcome</lang>
    <lang name="copy">Copy</lang>
</language>

必要な出力は次のとおりです。

<?xml version="1.0" encoding="UTF-16"?>
<language>
    <lang name="open">Open</lang>
    <lang name="close">Close</lang>
    <lang name="welcome">Welcome</lang>
    <lang name="copy">Copy</lang>
</language>

実際のファイルはこれよりはるかに大きく、「lang」と「name」はファイルの後半で変更される可能性があり、最後の複製のみを保持したいと思います。基本的に、タグと属性が重複している場合は、最後のエントリのみを保持します。これがXSLT1.0で可能になることを願っています。そうでない場合は、langが別のスクリプトに変更された場合に備えて、常に複数のスクリプトを使用できます。前もって感謝します!

4

2 に答える 2

5

次のXSLTがあなたの質問に答えるはずです:

    <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="lang[@name=following-sibling::lang/@name]"/>
</xsl:stylesheet>

このようにして、属性に同じ値を持つlang次の兄弟要素を持つすべての要素をフィルタリングします。langname

于 2012-10-23T10:08:30.750 に答える
1

現在受け入れられている回答の2次時間計算量(O(N ^ 2))よりも一般的で、はるかに効率的な(線形)ソリューション。OPによると、実際のドキュメントは次のようになっているため、これは大きなXMLドキュメントを処理する場合に特に重要です。

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

 <xsl:key name="kLangByName" match="lang" use="@name"/>

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

 <xsl:template match=
 "lang[not(generate-id()
      =
       generate-id(key('kLangByName', @name)[last()]))]"/>
</xsl:stylesheet>

この変換が提供されたXMLドキュメントに適用される場合:

<language>
    <lang name="welcome">welcom</lang>
    <lang name="open">Open</lang>
    <lang name="close">Close</lang>
    <lang name="welcome">Welcome</lang>
    <lang name="copy">Copy</lang>
</language>

必要な正しい結果が生成されます:

<language>
   <lang name="open">Open</lang>
   <lang name="close">Close</lang>
   <lang name="welcome">Welcome</lang>
   <lang name="copy">Copy</lang>
</language>

説明

Muenchianグループ化方法を使用します。

于 2012-10-23T12:44:16.507 に答える