1

以下のような XML があり、クラスのみが異なるため、2 番目のノードを削除したいと考えています。XSLT、xqy、または xpath を使用してこれを行うことができます。

<root>
   <name>
       <firstname>ABC</firstname>
       <class>12</class>
   </name>
   <name>
       <firstname>ABC</firstname>
       <class>11</class>
   </name>

   <name>
       <firstname>DEF</firstname>
       <class>9</class>
   </name>

   <name>
       <firstname>DEF</firstname>
       <class>10</class>
   </name>
</root>

期待される出力は

<root>
   <name>
       <firstname>ABC</firstname>
       <class>12</class>
   </name>
   <name>
       <firstname>DEF</firstname>
       <class>9</class>
   </name>
</root>

この方向の指針は役に立ちます。

ありがとう

4

2 に答える 2

3

これはグループ化の問題なので、XSLT 2.0 で使用します

<xsl:template match="root">
  <xsl:copy>
   <xsl:for-each-group select="name" group-by="firstname">
     <xsl:copy-of select="."/>
   </xsl:for-each-group>
  </xsl:copy>
</xsl:template>

XSLT 1.0 では Muenchian グループ化を使用

<xsl:key name="k1" match="name" use="firstname"/>

    <xsl:template match="root">
      <xsl:copy>
       <xsl:for-each select="name[generate-id() = generate-id(key('k1', firstname)[1])]">
         <xsl:copy-of select="."/>
       </xsl:for-each>
      </xsl:copy>
    </xsl:template>
于 2013-07-03T15:47:42.080 に答える
2

2 つおきの要素を選択できる場合、XQuery は次のようになります。

<root>{
  /root/name[position() mod 2 = 1]
}</root>

XQuery update を使用して、元のドキュメントを変更します。

delete nodes //name[position() mod 2 = 0]

名前が以前に発生したかどうかを比較する必要がある場合 (したがって、名前の最初のインスタンスのみを保持する場合)、述語を次のように変更します。

<root>{
  /root/name[not(firstname = preceding-sibling::name/firstname)]
}</root>

XQuery Update を使用したそれぞれのバリアント

delete nodes /root/name[firstname = preceding-sibling::name/firstname]
于 2013-07-03T16:24:15.277 に答える