Announcement

Collapse
No announcement yet.

XML zu XML

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

  • XML zu XML

    Hallo Forum,

    ich bin neu hier und im Thema XML-XSL. Ich bin 38 Jahre und seit 2 Jahren als Consultant beschäftigt. Im Jan. 07 habe ich einen sehr guten XML/XSL-Kurs besucht. Leider konnte ich bis heute mein gelerntes Wissen nicht einsetzen. Jetzt habe ich eine kleine Aufgabe und bin schon am verzweifeln. Eigentlich dachte ich, dass ich den Stoff gefressen hätte.

    Mein Problem
    Ich habe ein XML dort gibt es ein TAG <params> dort stehen in einem String eine bestimmte Anzahl an Werten.

    Zum Beispiel: MAT_PROJEKTNR="123,456,789,012" usw. (kann unterschiedlich viele Kommaseparierte Werte enthalten)

    In meinem XSL soll die gesamte MAT_PROJEKTNR transformiert werden, so dass diese in einem neuen XML sich folgendermaßen darstellt.

    Erwartetes Ergebnis:
    <CHARACT>MAT_PROJEKTNR</CHARACT><VALUE_CHAR>123</VALUE_CHAR>
    <CHARACT>MAT_PROJEKTNR</CHARACT><VALUE_CHAR>456</VALUE_CHAR>
    <CHARACT>MAT_PROJEKTNR</CHARACT><VALUE_CHAR>789</VALUE_CHAR>
    <CHARACT>MAT_PROJEKTNR</CHARACT><VALUE_CHAR>012</VALUE_CHAR>
    usw.

    Zur Zeit schaffe ich es nur, die MAT_PROJEKTNR=123 auszuschneiden, mehr geht nicht.

    Mein XSL-Code Ausschnitt:
    <xsl:template match="record[@type='ITEM' and @verb='CLASS']/data/XML-KS-ART">
    <xsl:variable name="Project"><xsl:value-of select="../../params/@MAT_PROJEKTNR"/></xsl:variable>
    ...
    <ALLOCVALUESCHARNEW>
    <CHARACT>MAT_PROJEKTNR</CHARACT>
    <VALUE_CHAR>
    <xsl:for-each select="$Project">
    <xsl:value-of select="substring($Project,1,3)"/>
    </xsl:for-each>
    </VALUE_CHAR>
    </ALLOCVALUESCHARNEW>
    </xsl:template>

    Wer kann mich mit ein paar kurzen aber für einen NEWBIE verständlichen Hinweisen wieder auf den Weg bringen.

    Für Eure Hilfe Danke ich Euch

    Stephan
    vogste
    XML/XSL-Newbie

  • #2
    Die erwartet Ausgabe lässt sich unter XSLT 1.0 mittels rekursivem Templateaufruf erreichen (hier wird zur Vereinfachung die Input-Zeichenkette direkt in einer xsl:variable vorgegeben):

    Code:
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
    <xsl:output method="xml"/>
    
    <xsl:template match="/">
    
    <wurzel>
    
      <xsl:variable name="Project" select="'123,456,789,012'"/>
    
      <xsl:call-template name="pr">
        <xsl:with-param name="Project" select="$Project"/>
      </xsl:call-template>
    
    </wurzel>
    
    </xsl:template>
    
    
    <xsl:template name="pr">
      <xsl:param name="Project" select="$Project"/>
      <CHARACT>MAT_PROJEKTNR</CHARACT>
      <VALUE_CHAR><xsl:value-of select="substring($Project,1,3)"/></VALUE_CHAR>
    
      <xsl:if test="string-length($Project) &gt;=4">
        <xsl:call-template name="pr">
          <xsl:with-param name="Project" select="substring($Project,5)"/>
        </xsl:call-template>
      </xsl:if>
    </xsl:template>
    
    </xsl:stylesheet>
    Sofern XSLT 2.0 und XPath 2.0 nutzbar sind, kämen weitere Vereinfachungen in Betracht.

    Comment


    • #3
      Re: Antwort auf mein Problem

      Hallo Thomas,

      vielen Dank für die schnelle Antwort. Ich habe zwar noch nicht alles Verstanden, aber das kommt noch. Ich werde jetzt versuchen Deine Hilfe
      umzusetzen.

      Ich Poste ob es bei mir geklappt hat.

      Danke
      Stephan Vogelfaenger

      Comment


      • #4
        Re: Antwort die zweite

        Hallo Thomas,

        alles SUUUPPPERR hat geklappt, ein kleiner Hacken war mit dem $ vor dem Project, dass raus und es funktioniert.
        Vielen Dank und Gruß

        Stephan Vogelfaenger

        Comment

        Working...
        X