Reth: Probleme beim Zusammenführen von XML-Dateien

Hallo zusammen,

ich versuche gerade, aus den Daten zweier XML-Dateien eine gemeinsame XML-Ergebinisdatei zu erstellen.
Dabei werden fast alle Daten (inkl. der Tags) der ersten Datei unverändert verwendet und es soll nur ein Wert eines Tags durch den entsprechenden Wert desselben Tags aus der zweiten Datei ersetzt werden.
Die Einträge in beiden Dateien können dabei durch einen eindeutigen Schlüsses identifiziert und zugeordnet werden.

Da meine Kenntnisse veraltet und eingerostet sind ist mein Ansatz sicherlich nicht der Beste. Ich iteriere gerade über alle Elemente der ersten Datei und versuche diese in der gleichen Struktur wieder auszugeben. Dabei haben aber einige eines jeden Eintrages Tags Attribute, andere nicht.

Ich erzeuge die Ausgabedatei, indem ich die Tags einfach als Text in die XSL-Datei einfüge und die Werte dieser Tags aus der Iteration der Einträge aus der ersten Datei nehme (nur als 1. Schritt, die Zuweisung aus der 2. Datei heb ich mir als 2. Schritt auf).
Dabei bekomme ich aber das Problem, dass ich in die Tags, die ich einfach als Text in der XSL ausgebe Attribute einfügen muss, deren Werte aus der Iteration kommen. Die Frage ist nur, wie mache ich das? Wenn ich ein Tag einfach ausgebe und es noch geöffnet ist und ich darin versuche mit <xsl:value-of select=... etwas auszugeben motzt der Parser zurecht. Allerdings, wie geht es denn? Direkt in die Ausgabe von <xsl:value-of select=... die benötigten Tags als feste Strings mit aufnehmen?

Hier kurz noch ein Bsp.:
Die Einträge der ersten Datei, über die ich iteriere haben alle folgenden Aufbau:
<card><name id="id_value">Name</name><set>Set</set></card>
Nun versuche ich in der Schleife folgendes auszugeben:
<card><name id="<xsl:value-of select="name.id" />"><xsl:value-of select="name" /></name></card> was natürlich nicht geht.
Was wäre denn hier der geeignetste Ansatz, die Daten korrekt auszugeben?

Im 2. Schritt soll direkt bei diesen Ausgaben der Wert des Tags "set" aus der ersten Datei mit dem Wert desselben Tags (Set) aus der zweiten Datei ersetzt werden. Dabei dient der Wert des Tags "name" der ersten Datei als Schlüssel zum Auffinden des entsprechenden Eintrages in der 2. Datei (über "name" können die Einträge in beiden Dateien eindeutig zugeordnet werden).
Hier hab ich aber noch keine Idee, wie ich das hinbekommen soll.

Bin für jeden Tip oder Verweise auf hilfreiche Infos dankbar!

Ciao

  1. Also den ersten Teil konnte ich fast mit concat() lösen. Sieht dann so aus:

    <xsl:value-of select="concat('&lt;card&gt;&lt;name id=&quot;', name/@id, '&quot;&gt;', name, '&lt;/name&gt;&lt;set&gt;', set, '&lt;/set&gt;&lt;/card&gt;')" />

    Leider werden bei mir aber die &lt; und &gt; nicht umgewandelt (nutze XT mit XP). Weiss da jmd. Rat? Für das zweite Problem hab ich noch keinen Ansatz probiert.

  2. Moin,

    Hallo zusammen,

    ich versuche gerade, aus den Daten zweier XML-Dateien eine gemeinsame XML-Ergebinisdatei zu erstellen.
    Dabei werden fast alle Daten (inkl. der Tags) der ersten Datei unverändert verwendet und es soll nur ein Wert eines Tags durch den entsprechenden Wert desselben Tags aus der zweiten Datei ersetzt werden.
    Die Einträge in beiden Dateien können dabei durch einen eindeutigen Schlüsses identifiziert und zugeordnet werden.

    Da meine Kenntnisse veraltet und eingerostet sind ist mein Ansatz sicherlich nicht der Beste.

    Sind deine Kenntnisse denn älter als <http://de.selfhtml.org/xml/darstellung/index.htm@title=die SELFHTML-Doku>? Zu deiner Fragestellung finde ich dort nämlich u.a. auch <http://de.selfhtml.org//xml/darstellung/xsltbeispiele.htm@title=nette Beispiele>.

    Viele Grüße,
    Robert

    1. Sind deine Kenntnisse denn älter als <http://de.selfhtml.org/xml/darstellung/index.htm@title=die SELFHTML-Doku>? Zu deiner Fragestellung finde ich dort nämlich u.a. auch <http://de.selfhtml.org//xml/darstellung/xsltbeispiele.htm@title=nette Beispiele>.

      Teils, teils. Hab die Bsps. mal kurz überflogen, konnte daraus aber nicht entnehmen, wie diese bei der nicht stattfindenden Konvertierung von &lt; bzw. &gt; oder aber bei der Zuordnung eines Wertes der 2. Datei während der Ausgabe von Werten aus der ersten Datei helfen. Was habe ich übersehen?

      xsl:attribute hilft mir leider nicht, da ich eigene Tags ausgeben möchte. Oder muss ich mir diese dazu in einem eigenen Namensraum definieren? Wenn ja, dann hab ich davon noch keine Ahnung.

      1. Moin Reth,

        xsl:attribute hilft mir leider nicht, da ich eigene Tags ausgeben möchte. Oder muss ich mir diese dazu in einem eigenen Namensraum definieren? Wenn ja, dann hab ich davon noch keine Ahnung.

        Aus dem Ausgangsposting …

        Nun versuche ich in der Schleife folgendes auszugeben:
        <card><name id="<xsl:value-of select="name.id" />"><xsl:value-of select="name" /></name></card> was natürlich nicht geht.
        Was wäre denn hier der geeignetste Ansatz, die Daten korrekt auszugeben?

        … in Kombination mit der Doku:

        <card>  
          <name>  
            <xsl:attribute name="id"><xsl:value-of select="name/@id"/></xsl:attribute>  
            <xsl:value-of select="name"/>  
          </name>  
        </card>
        

        Du kannst allerdings auch – falls gewünscht – mit xsl:for-each über alle Attribute iterieren und ins Ergebnis schreiben.

        Dein zweites Problem kannst du vielleicht mit Hilfe von http://de.selfhtml.org/xml/darstellung/xpathfunktionen.htm@title=XPath lösen.

        Viele Grüße,
        Robert

        1. <card>

          <name>
              <xsl:attribute name="id"><xsl:value-of select="name/@id"/></xsl:attribute>
              <xsl:value-of select="name"/>
            </name>
          </card>

            
          Super, besten Dank! Da stand ich auf dem Schlauch, dachte, dass ich mit xsl:attribute nur vorgegebene Attribute erzeugen kann. Vielen Dank für die Hilfe.  
            
          
          > Dein zweites Problem kannst du vielleicht mit Hilfe von <http://de.selfhtml.org/xml/darstellung/xpathfunktionen.htm@title=XPath> lösen.  
            
          Ja, das hatte ich mir auch schon überlegt. Hab nun ne ganze Weile rumprobiert und einiges ausgetestet. Am Ende hab ich ne Möglichkeit gefunden:  
            
          Ich iteriere über alle auszugebenden Elemente der ersten Datei (die kleinere Menge) und selektiere für jedes den entsprechenden Eintrag aus der zweiten Datei, bei dem der Wert des Kindelements Name identisch ist ($nodes1 enthält dabei alle Einträge der zweiten, größeren Datei; $ident enthält den Wert des name-Elementes des aktuellen Eintrages aus der Iteration über die erste Datei; der Wert des Elemtents Set des gefundenen Elements aus der zweiten Datei wird dabei ins Ergebnis ausgegeben):  
          ~~~xml
            
          <xsl:value-of select="$nodes1/record[Name=$ident]/Set"/>  
          
          
          1. Hallo Reth,

            <card>

            <name>
                <xsl:attribute name="id"><xsl:value-of select="name/@id"/></xsl:attribute>
                <xsl:value-of select="name"/>
              </name>
            </card>

            
            >   
            > Super, besten Dank! Da stand ich auf dem Schlauch, dachte, dass ich mit xsl:attribute nur vorgegebene Attribute erzeugen kann. Vielen Dank für die Hilfe.  
              
            Anmerkung: xsl:attribute sollte nur dann verwendet werden, wenn sich der Attributname dynamisch ergeben soll oder die Ausgabe des Attributwertes zusätzliche Operationen erfordert. Hier reicht:  
              
            ~~~xml
            <card>  
              <name id="{name/@id}">  
                <xsl:value-of select="name"/>  
              </name>  
            </card>
            

            Zum Erzeugen von Elementen und Attributen siehe auch diese Hinweise.

            Grüße,
            Thomas