2017-02-03 11 views
0

次のXMLデータでは、いくつかの項目が異なるIDを持っています。たとえば、項目「apfel」には、常に同じものではなく複数のIDがあります。WANTED:出力で重複を取り除くxsltハック

私は次のように矛盾を集計する
<lieferungen> 
    <artikel id="3526"> 
     <name>apfel</name> 
     <lieferant>Fa. Krause</lieferant> 
     <preis stueckpreis="true">8.97</preis> 
    </artikel> 
    <artikel id="7866"> 
     <name>Kirschen</name> 
     <preis stueckpreis="false">10.45</preis> 
     <lieferant>Fa. Helbig</lieferant> 
    </artikel> 
    <artikel id="3526"> 
     <preis stueckpreis="true">12.67</preis> 
     <lieferant>Fa. Liebig</lieferant> 
     <name>apfel</name> 
    </artikel> 
    <artikel id="7866"> 
     <preis stueckpreis="false">17.67</preis> 
     <name>Kirschen</name> 
     <lieferant>Fa. Krause</lieferant> 
    </artikel> 
    <artikel id="3627"> 
     <name>apfel</name> 
     <lieferant>Fa. Mertes</lieferant> 
     <preis stueckpreis="true">9.54</preis> 
    </artikel> 
    <artikel id="7866"> 
     <name>Kirschen</name> 
     <lieferant>Fa. Hoeller</lieferant> 
     <preis stueckpreis="false">16.45</preis> 
    </artikel> 
    <artikel id="7868"> 
     <preis>3.20</preis> 
     <name>Kohl</name> 
     <lieferant>Fa. Hoeller</lieferant> 
    </artikel> 
    <artikel id="7866"> 
     <name>Kirschen</name> 
     <lieferant>Fa. Richard</lieferant> 
     <preis stueckpreis="false">12.45</preis> 
    </artikel> 
    <artikel id="3245"> 
     <preis stueckpreis="false">15.67</preis> 
     <name>Bananen</name> 
     <lieferant>Fa. Hoeller</lieferant> 
    </artikel> 
    <artikel id="6745"> 
     <name>Kohl</name> 
     <lieferant>Fa. Reinhardt</lieferant> 
     <preis stueckpreis="false">3.10</preis> 
    </artikel> 
    <artikel id="7789"> 
     <name>Ananas</name> 
     <preis stueckpreis="true">8.60</preis> 
     <lieferant>Fa. Richard</lieferant> 
    </artikel> 
</lieferungen> 

enter image description here

この目的を達成するために、私は次の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="html" encoding="utf-8"/> 

    <xsl:template match="lieferungen"> 
     <html> 
      <head> 
       <title> 
        <xsl:text>Inkonsistenzen</xsl:text> 
       </title> 
      </head> 
      <body bgcolor="#ffffff"> 
       <h1> 
        <xsl:text>Inkonsistenzen</xsl:text> 
       </h1> 
       <hr/> 
       <p> 
        <xsl:text>Die Datei enthält folgende Inkonsistenzen: 
       </xsl:text> 
       </p> 
        <xsl:apply-templates/> 
       <hr/> 

      </body> 
     </html> 
    </xsl:template> 

    <xsl:template match="artikel"> 
     <xsl:variable name="this_name" select="name/text()"/> 
     <xsl:variable name="this_id" select="@id"/> 
     <xsl:variable name="this_prod" select="lieferant/text()"/> 

     <xsl:for-each select="//artikel"> 
      <xsl:if test="name/text() = $this_name"> 
       <xsl:if test="not(@id = $this_id)"> 
        <p> 
         <xsl:text>Inkonsistenz: Name1=</xsl:text> 
         <xsl:value-of select="$this_name"/> 
         <xsl:text>; Lieferant1=</xsl:text> 
         <xsl:value-of select="$this_prod"/> 
         <xsl:text>; ID1=</xsl:text> 
         <u> 
          <b> 
           <xsl:value-of select="$this_id"/> 
          </b> 
         </u> 
         <xsl:text> ; Name2=</xsl:text> 
         <xsl:value-of select="name/text()"/> 
         <xsl:text>; Lieferant2=</xsl:text> 
         <xsl:value-of select="lieferant/text()"/> 
         <xsl:text>; ID2=</xsl:text> 
         <u> 
          <b> 
           <xsl:value-of select="@id"/> 
          </b> 
         </u> 
        </p> 
       </xsl:if> 
      </xsl:if> 
     </xsl:for-each> 

    </xsl:template> 

</xsl:stylesheet> 

これの出力があります以下:

Inkonsistenzen 


    Die Datei enthält folgende Inkonsistenzen: 
    Inkonsistenz: Name1=apfel; Lieferant1=Fa. Krause; ID1=3526 ; Name2=apfel;  
    Lieferant2=Fa. Mertes; ID2=3627 
    Inkonsistenz: Name1=apfel; Lieferant1=Fa. Liebig; ID1=3526 ; Name2=apfel; 
    Lieferant2=Fa. Mertes; ID2=3627 
    Inkonsistenz: Name1=apfel; Lieferant1=Fa. Mertes; ID1=3627 ; Name2=apfel; 
    Lieferant2=Fa. Krause; ID2=3526 
    Inkonsistenz: Name1=apfel; Lieferant1=Fa. Mertes; ID1=3627 ; Name2=apfel; 
    Lieferant2=Fa. Liebig; ID2=3526 
    Inkonsistenz: Name1=Kohl; Lieferant1=Fa. Hoeller; ID1=7868 ; Name2=Kohl; 
    Lieferant2=Fa. Reinhardt; ID2=6745 
    Inkonsistenz: Name1=Kohl; Lieferant1=Fa. Reinhardt; ID1=6745 ; Name2=Kohl; 
    Lieferant2=Fa. Hoeller; ID2=7868 

出力には、私が望むだけ正確に2倍の数の項目が含まれています。その理由は、すべてのLieferant(サプライヤー)がLieferant 1(サプライヤー1)とLieferant 2(サプライヤー2)の両方として出現しているためです。

重複を担当するコードは以下の通りです:

  <xsl:for-each select="//artikel"> 
      <xsl:if test="name/text() = $this_name"> 
       <xsl:if test="not(@id = $this_id)"> 
        <p> 
         <xsl:text>Inkonsistenz: Name1=</xsl:text> 
         <xsl:value-of select="$this_name"/> 
         <xsl:text>; Lieferant1=</xsl:text> 
         <xsl:value-of select="$this_prod"/> 
         <xsl:text>; ID1=</xsl:text> 
         <u> 
          <b> 
           <xsl:value-of select="$this_id"/> 
          </b> 
         </u> 
         <xsl:text> ; Name2=</xsl:text> 
         <xsl:value-of select="name/text()"/> 
         <xsl:text>; Lieferant2=</xsl:text> 
         <xsl:value-of select="lieferant/text()"/> 
         <xsl:text>; ID2=</xsl:text> 
         <u> 
          <b> 
           <xsl:value-of select="@id"/> 
          </b> 
         </u> 
        </p> 
       </xsl:if> 
      </xsl:if> 
     </xsl:for-each> 

私は重複が現在のコードで発生した理由を知っているが、私は、所望の出力を得るためにそれを変更する方法がわかりません。

+0

xsl:for-eachに2 xsl:ifで条件を追加することができます

注これは*のグループ化*問題のようです。 XSLT 1.0を使用している場合は、ここをクリックしてください:http://www.jenitennison.com/xslt/grouping/muenchian.html –

答えて

2

このための最も簡単な修正、これに次の行を変更することです...

<xsl:for-each select="//artikel"> 

..

<xsl:for-each select="following-sibling::artikel"> 

言うのではなく、すべてのartikelsと比較、単に比較することですそれに続くもの(以前のものはすでに考慮されているため)。あなたには、いくつかのネストを避け、代わりに

<xsl:for-each select="following-sibling::artikel[name = $this_name][not(@id = $this_id)]"> 
+0

ソリューションをありがとうございます! – Tommy

関連する問題