Frage zu XSLT,XPath,XQuery

WeirdAl

Mitglied
Hi,
ich möchte eine XML Datei per XSLT in eine andere XML Datei transformieren. Das Problem an der Sache ist, das die Ursprungs-XML sehr wirr aufgebaut ist und unter anderem diesen Teil enthält:
HTML:
<position>
	<matnr>000000000000010208</matnr>
	<posnr>000020</posnr>
	<hipos/>
	<charg/>
</position>
<position>
	<matnr>000000000000010208</matnr>
	<posnr>000021</posnr>
	<hipos>000020</hipos>
	<charg>0000000118</charg>
</position>
<position>
	<matnr>000000000000010208</matnr>
	<posnr>000021</posnr>
	<hipos>000020</hipos>
	<charg>0000000120</charg>
</position>

Dieser Teil soll nun so umgebaut werden, dass ich erstmal alle Positionen ohne <hipos> ermittle und Positionen mit <hipos> anschließend unter diese Positionen ohne <hipos> hänge. Dabei muss ich beachten, dass posnr=hipos gegeben ist.

So soll es dann aussehen:

HTML:
<position number="000020">
	<matnr>000000000000010208</matnr>
	<charges>
	 <charge number="0000000118">
		<hipos>000020</hipos>
		<posnr>000021</posnr>
	 </charge>
	 <charge number="0000000120">
		<hipos>000020</hipos>
		<posnr>000022</posnr>
	 </charge>
	</charges>
</position>

Ich habe jetzt schon mit xpath und xquery fast einen ganzen Tag herumgespielt, aber ich komme auf keinen grünen Ast. Könnt ihr mir vielleicht weiterhelfen?
 
Also mit xpath unter php habe ich auch so meine Probleme. Aber wenn ich den Titel richtig verstanden habe, geht es ja um eine Umwandlung via xsl. Und das ist relativ problemlos möglich.

Möglicherweise gibt es berrere Ideen, aber diese hier basiert darauf, dass Du die Ursprungsdatei zwei mal durchläufst und dabei zwei verschiedene Templates benutzt, die über den Mode parameter unterschieden werden. Also etwa so:
PHP:
<xsl:template match="position" mode="ohne">
  <xsl:if test="hipos = ''">
    <xsl:copy>
      <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>

<xsl:template match="position" mode="mit">
  <xsl:if test="not(hipos = '')">
    <xsl:copy>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:if>
</xsl:template>

Aufrufen tust Du das eben in der gewünschten Reihenfolge:
PHP:
<xsl:apply-templates select="position" mode="ohne"/>
<xsl:apply-templates select="position" mode="mit"/>
 
Zurück