0

xml ファイルに重複するノードが存在するかどうかを確認し、このノードの内容を確認し、可能であれば xslt を使用して ID 番号で両方のノードを区別する可能性はありますか? たとえば、このxmlファイルがあります

<Racine>
  <el1>
   <fils1>context1</fils1>
   <fils2>test1</fils2>
   <fils1>context1</fils1>
  </el1>
  <el2>
   <fils1>context2</fils1>
   <fils2>test2</fils2>
   <fils1>context2</fils1>
  </el2>
  <el3>...........<el3>
</Racine>

この場合、たとえばノード「fils1 」はノード「 el1」に 2 回出現し、それぞれの内容は同じです。この場合、このノードが次のようになるように、xml ファイルを変換する必要があります。

<fils1 id=1>context1</fils1>.

同じ名前と同じ内容を持つ両方のノードを区別するために、ID 番号を自動的に追加します。そして、ノードが異なる内容を持つ同じ名前を取得した場合(ノードの内容のスペースも違いと見なす必要があります)、ノードをそのままにします。XSLTを使用してこれを可能にするにはどうすればよいですか? ここの誰かがそれを変えるのを手伝ってくれませんか? どうもありがとうございました。
フランキー

ご指摘ありがとうございます。予想される出力は次のとおりです。

<Racine>
  <el1>
   <fils1 id=1>context1</fils1>
   <fils2>test1</fils2>
   <fils1 id=2>context1</fils1>
  </el1>
  <el2>
   <fils1 id=1>context2</fils1>
   <fils2>test2</fils2>
   <fils1 id=2>context2</fils1>
  </el2>
  <el3>...........
   <fils1 id=3>context1</fils1>
  <el3>
</Racine>

「 el1」と「el2 」のノード「fils2」については、包含が異なるため、それらを変更せずに保持し、そうでない場合は ID 番号を追加して違いを作りたいと考えています。

4

1 に答える 1

0

このXSLT1.0スタイルシート...

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

<xsl:key name="kCommon" match="*[starts-with(name(),'fils')]"
                        use="concat(name(),'|',.)" />

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

<xsl:template match="*[starts-with(name(),'fils')]
                      [count(key('kCommon',concat(name(),'|',.))) >= 2]">
  <xsl:copy>
    <xsl:apply-templates select="@*"/>
    <xsl:variable name="this-key" select="concat(name(),'|',.)" />
    <xsl:attribute name="id"><xsl:value-of select="
      count(preceding::*
             [starts-with(name(),'fils')]
             [count(.|key('kCommon',$this-key)) =
              count(  key('kCommon',$this-key))    ]
            ) + 1" /></xsl:attribute>
    <xsl:apply-templates select="node()"/>
  </xsl:copy>
</xsl:template>  

</xsl:stylesheet>

...この入力を変換します...

<Racine>
  <el1>
   <fils1>context1</fils1>
   <fils2>test1</fils2>
   <fils1>context1</fils1>
  </el1>
  <el2>
   <fils1>context2</fils1>
   <fils2>test2</fils2>
   <fils1>context2</fils1>
  </el2>
  <el3>
   <fils1>context1</fils1>
  </el3>
</Racine>

...の中へ...

<Racine>
  <el1>
    <fils1 id="1">context1</fils1>
    <fils2>test1</fils2>
    <fils1 id="2">context1</fils1>
  </el1>
  <el2>
    <fils1 id="1">context2</fils1>
    <fils2>test2</fils2>
    <fils1 id="2">context2</fils1>
  </el2>
  <el3>
    <fils1 id="3">context1</fils1>
  </el3>
</Racine>

説明

共通の名前と共通のテキストコンテンツの両方を持つfils要素のキー(「kCommon」)を作成します。少なくとも2つのキーグループのメンバーシップを持つ要素を探します。つまり、少なくとも1つの他のfilX要素と共通の名前とテキストを持つfilXタイプの要素を探します。これが最後のテンプレートです。

このような共通の要素ごとに、2つのセットを作成します。

  1. 共通グループ内の先行するすべてのfil要素のセット。このセットはによって与えられます...

    セット1

    preceding::*[starts-with(name(),'fils')]
    
  2. そして、このノードの共通名+コンテンツグループは...

    セット2

    key('kCommon',concat(name(),'|',.))
    

    ただし、concat(name()、'|' ,.)quietを数回参照し、このコンテキストノードに直接アクセスできない場所では、concat()を計算して、Set2に代入するだけです。このような。セット2はすぐに計算できるようになりました。

    セット2

    key('kCommon',$this-key)
    
  3. 次に、 Kaysianメソッドを使用して集合交差を取ります。

     $set1[count(.|$set2)=count($set2)]
    
  4. この交差点は、その前にあるこの交差点と同じ考えを持つすべての要素のセットです。それらをカウントして1つ追加するだけで、idプロパティの序数が得られます。

于 2012-09-12T14:41:25.777 に答える