Announcement

Collapse
No announcement yet.

von bis Element mit xslt 2.0

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

  • von bis Element mit xslt 2.0

    Hallo Leute,

    ich stecke gerade wieder bei einem leichten Problem:

    Eingangs-XML

    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <root>
    	<hallo1>
    		<hallo2>test1</hallo2>
    		<hallo3>
    			<hallo4>das interessiert mich</hallo4>
    		</hallo3>
    	</hallo1>
    	<hallo1>
    		<hallo2/>
    		<hallo3>
    			<hallo4>das interessiert mich 1</hallo4>
    		</hallo3>
    	</hallo1>
    	<hallo1>
    		<hallo2/>
    		<hallo3>
    			<hallo4>das interessiert mich 2</hallo4>
    		</hallo3>
    	</hallo1>
    	<hallo1>
    		<hallo2>test2</hallo2>
    		<hallo3>
    			<hallo4>das interessiert mich</hallo4>
    		</hallo3>
    	</hallo1>
    	<hallo1>
    		<hallo2/>
    		<hallo3>
    			<hallo4>das interessiert mich 1</hallo4>
    		</hallo3>
    	</hallo1>
    	<hallo1>
    		<hallo2>test3</hallo2>
    		<hallo3>
    			<hallo4>das interessiert mich</hallo4>
    		</hallo3>
    	</hallo1>
    	<hallo1>
    		<hallo2/>
    		<hallo3>
    			<hallo4>das interessiert mich 1</hallo4>
    		</hallo3>
    	</hallo1>
    </root>
    Problem:

    ich will den Inhalt von hallo4 jeweils haben. Der ist aber immer begrenzt. Die Grenze beginnt immer ab hallo2.

    also hallo2 = test, test1 und test2.

    Am Ende soll das Ganze so ausschauen:

    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <root>
    	<juhu1>
    		<hallo4>das interessiert mich</hallo4>
    		<hallo4>das interessiert mich 1</hallo4>
    		<hallo4>das interessiert mich 2</hallo4>
    	</juhu1>
    	<juhu2>
    		<hallo4>das interessiert mich</hallo4>
    		<hallo4>das interessiert mich 1</hallo4>
    	</juhu2>
    	<juhu3>
    		<hallo4>das interessiert mich</hallo4>
    		<hallo4>das interessiert mich 1</hallo4>
    	</juhu3>
    </root>
    Mein Problem ist, dass ich die Grenze nicht ausfindig machen kann.
    Ich könnte das mit intersection machen. Also die Schnittmenge oberhalb und unterhalb einer Grenze. Aber das geht nur mit den EXSLT Tools und mit Saxon habe ich das nicht hinbekommen.

    Dann habe ich mir überlegt, ich könnte das alles zählen. Also 7 Elemente gibts und dann zähle ich 2 und 2. Das heisst also ich nehme mir den inhalt von den ersten 3 und dann 2 und dann 2. Hab das nicht hinbekommen.

    Mein erster Versuch war es, alles unterhalb von test zu nehmen und dann zu prüfen ob das element leer ist bei hallo2. und wenn ja gehört es zu test. Aber er nimmt ja alles und dann zählt er auch die unteren mit.

    Das musst doch irgendwie ganz einfach funktionieren. Ohne irgendwelche extensions oder so????

    Kann mir jemand helfen.
    Danke im voraus :-)

  • #2
    Das ist ein Gruppierungsproblem, das man mittels for-each-group group-starting-with lösen kann:
    Code:
    <xsl:stylesheet
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      version="2.0">
      
      <xsl:output method="xml" indent="yes"/>
      
      <xsl:template match="root">
        <xsl:copy>
          <xsl:for-each-group select="hallo1/*" group-starting-with="hallo2[node()]">
            <xsl:element name="juhu{position()}">
              <xsl:copy-of select="current-group()/hallo4"/>
            </xsl:element>
          </xsl:for-each-group>
        </xsl:copy>
      </xsl:template>
    
    </xsl:stylesheet>

    Comment


    • #3
      Super

      Vielen Dank. Die group-Funktion habe ich ganz vergessen, da ich in letzter Zeit nur mit XSLT 1.0 gearbeitet habe. Es funktioniert.

      Grüße,
      Tamer

      Comment

      Working...
      X