Announcement

Collapse
No announcement yet.

im XPATH mehrere Elemente Abgleichen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • im XPATH mehrere Elemente Abgleichen

    Hallo zusammen,

    ich habe mal wieder ein Problem, bei dem ich nicht weiter komme:

    ich habe folgende XML Struktur:

    Code:
    <root>
      <Dokument>
         <Produktarten>
             <Produktart>Art1</Produktart>
             <Produktart>Art2</Produktart>
             <Produktart>Art3</Produktart>
         </Produktarten>
         <Kapitel>
                <Produktarten>
                      <Produktart>Art1</Produktart>
                      <Produktart>Art2</Produktart>
                      <Produktart>Art3</Produktart>
                </Produktarten>
          </Kapitel>
          <Kapitel>
                <Produktarten>
                      <Produktart>Art1</Produktart>
                      <Produktart>Art2</Produktart>
                      <Produktart>Art3</Produktart>
                      <Produktart>Art4</Produktart>
                      <Produktart>Art5</Produktart>
                </Produktarten>
          </Kapitel>
          <Kapitel>
                <Produktarten>
                      <Produktart>Art4</Produktart>
                      <Produktart>Art5</Produktart>
                </Produktarten>
           </Kapitel>
           <Kapitel>
                <Produktarten>
                      <Produktart>Art3</Produktart>
                </Produktarten>
           </Kapitel>
      </Dokument>
    </root>
    Ergebnis soll sein:

    Code:
    <root>
      <Dokument>
         <Produktarten>
             <Produktart>Art1</Produktart>
             <Produktart>Art2</Produktart>
             <Produktart>Art3</Produktart>
         </Produktarten>
         <Kapitel>
                <Produktarten>
                      <Produktart>Art1</Produktart>
                      <Produktart>Art2</Produktart>
                      <Produktart>Art3</Produktart>
                </Produktarten>
          </Kapitel>
          <Kapitel>
                <Produktarten>
                      <Produktart>Art1</Produktart>
                      <Produktart>Art2</Produktart>
                      <Produktart>Art3</Produktart>
                      <Produktart>Art4</Produktart>
                      <Produktart>Art5</Produktart>
                </Produktarten>
          </Kapitel>
          <Kapitel>
                <Produktarten>
                      <Produktart>Art3</Produktart>
                </Produktarten>
           </Kapitel>
      </Dokument>
    </root>
    Also nur die Kapitel ausgeben, bei denen mindestens eine Produktart mit dem des Dokuments übereinstimmt. Es gibt viele Dokumente und insgesamt 8 Produktarten.
    Mein Ansatz ist:
    Code:
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
       <xsl:for-each select="//Dokument">
           <xsl:variable name="cur.doku.Prod_art">
    		<xsl:value-of select="Prodarten[concat(Produktart, '')]"/>
    	</xsl:variable>
       <xsl:for-each select="descendant::Kapitel[Produktarten/Produktart='' or contains(concat(Prod_arten/Prodart, ''), $cur.doku.Prod_art)]">
             <xsl:copy-of select="Produktarten"/>
        </xsl:for-each>
      </xsl:for-each>
    </xsl:template>
    </xsl:stylesheet>
    Mir ist klar, dass das so nicht funktionieren kann, weil in der Variable "Art1Art2Art3" steht und dieser komplette String nur im ersten Kapitel vorkommt, das mir auch ausgegeben wird ...
    Muss ich die Variablendefinition ändern? Ist der Ansatz überhaupt zu gebrauchen? Es steht leider nur xslt 1.0 zur verfügung...
    Ich hoffe mir kann mal wieder geholfen werden...

    Vielen Dank!
    Helix

  • #2
    Bezogen auf den genannten XSLT-Code sollte dieser Ansatz weiterhelfen:
    Code:
    <xsl:for-each select="//Dokument">
    
      <xsl:variable name="cur.doku.Prod_art">
        <xsl:copy-of select="Produktarten/Produktart"/>
      </xsl:variable>
    
      <xsl:for-each select="Kapitel">
        <xsl:if test="count(Produktarten/Produktart[contains($cur.doku.Prod_art,.)]) >= 1">
          <xsl:copy-of select="Produktarten"/>
        </xsl:if>
      </xsl:for-each>
    
    </xsl:for-each>
    Ergebnis-Fragment:
    Code:
    <Produktarten>
      <Produktart>Art1</Produktart>
      <Produktart>Art2</Produktart>
      <Produktart>Art3</Produktart>
    </Produktarten>
    <Produktarten>
      <Produktart>Art1</Produktart>
      <Produktart>Art2</Produktart>
      <Produktart>Art3</Produktart>
      <Produktart>Art4</Produktart>
      <Produktart>Art5</Produktart>
    </Produktarten>
    <Produktarten>
      <Produktart>Art3</Produktart>
    </Produktarten>
    Zuletzt editiert von Thomas Meinike; 07.03.2009, 15:39.

    Comment


    • #3
      Hallo,
      man könnte doch auch ein "Identity Template" verwenden und die betreffenden Knoten über einen Schlüssel vom Kopieren ausschließen:
      Code:
      <xsl:key name="pa" match="Dokument/Produktarten" use="Produktart" />
      
      <xsl:template match="@*|node()">
      	<xsl:copy>
      		<xsl:apply-templates select="@*|node()" />
      	</xsl:copy>
      </xsl:template>
      
      <xsl:template match="Kapitel">
      	<xsl:if test="boolean(key('pa',Produktarten/Produktart))">
      		<xsl:copy>
      			<xsl:apply-templates select="@*|node()" />
      		</xsl:copy>
      	</xsl:if>
      </xsl:template>
      Zuletzt editiert von hela; 08.03.2009, 14:06. Reason: Korrektur Schreibfehler

      Comment


      • #4
        Hi danke für die Antworten!

        hab es nach der Methode von Thomas gemacht und es funktioniert wunderbar.

        Vielen Dank!

        Comment

        Working...
        X