Announcement

Collapse
No announcement yet.

XML transf.: Element hinzufügen...?

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

  • XML transf.: Element hinzufügen...?

    Hi -
    ich versuche per XLST ein XML-File anzuändern und bekomme es nicht hin - ich muss eine Datei in Indesign einlesen...

    XML Ausgangsfile:
    Code:
    <GSEXPORTDATA>
      <DATASET>
        <RECORD>
          <ARTNR>611105</ARTNR>
        </RECORD>
        <RECORD>
          <ARTNR>611108</ARTNR>
        </RECORD>
      <DATASET>
    <GSEXPORTDATA>
    XML Zielfile:
    Code:
    <GSEXPORTDATA>
      <DATASET>
        <RECORD>
          <ARTNR>611105</ARTNR>
          <IMAGE href="file://media/img/611105.jpg" />
        </RECORD>
        <RECORD>
          <ARTNR>611108</ARTNR>
          <IMAGE href="file://media/img/611108.jpg" />
        </RECORD>
      <DATASET>
    <GSEXPORTDATA>
    also das IMAGE muss hinzu und der Bildname ist gleich dem Inhalt von ARTNR

    selbst meine bisherigen Versuche scheitern :-((

    XSL:
    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="2.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="GSEXPORTDATA/DATASET/">
        <xsl:for-each select="RECORD">        
        <xsl:copy-of select="ARTNR"/>
        <xsl:element name="IMAGE"><xsl:copy-of select="ARTNR"/></xsl:element>
        </xsl:for-each>  
      </xsl:template>
    </xsl:stylesheet>

    kann mir jemand mein XSL "pimpen"...??

    mit Dank!!

    Ingolf

  • #2
    pimp your XSLT

    Guten Morgen,

    bitte schön:

    Code:
    	<xsl:template match="*">
    		<xsl:copy>
    			<xsl:apply-templates select="*"/>
    		</xsl:copy>
    	</xsl:template>
    
    	<xsl:template match="RECORD">
    		<xsl:copy>
    			<xsl:copy-of select="ARTNR"/>
    			<IMAGE href="{concat('file://media/img/', ARTNR, '.jpg')}"/>
    		</xsl:copy>
    	</xsl:template>

    Comment


    • #3
      XSLT-2.0-Identitäts-Template mit Anpassung für RECORD-Elemente:

      Code:
      <?xml version="1.0" encoding="UTF-8"?>
      <xsl:stylesheet version="2.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="element()">
          <xsl:copy>
            <xsl:apply-templates select="@*, node()"/>
          </xsl:copy>
        </xsl:template>
      
        <xsl:template match="attribute() | text() | comment() | processing-instruction()">
          <xsl:copy/>
        </xsl:template> 
      
        <xsl:template match="RECORD">
          <xsl:copy>
            <xsl:apply-templates select="@*, node()"/>
            <IMAGE href="file://media/img/{ARTNR}.jpg"/>    
          </xsl:copy>   
        </xsl:template>
      
      </xsl:stylesheet>

      Comment


      • #4
        Wow!

        Hallo Thomas und Z-Man,

        beide Umwandlungen funktionieren wunderbar - der Tag ist gerettet!! :-)

        ...eine kleine Zusatzfrage:

        in RECORD stehen neben dem Element ARTNR noch weitere Elemente ("Geschwister") - gibt es sowas wie "kopiere alles was jeweils in RECORD ist und füge nach Element xy (ARTNR) neues Element (IMAGE) ein"?

        sonnst muss ich aufpassen, dass ich per "xsl:copy-of" alle voehandenen Elemente erwische...


        Meinen Super-Dank!!

        Gruss Ingolf

        Comment


        • #5
          Mein Beispiel müsste alles Weitere unterhalb von RECORD berücksichtigen. Das IMAGE-Element steht dann vielleicht nicht mehr direkt nach ARTNR, aber noch immer als Kindelement unter RECORD.

          Verwende alternativ statt RECORD-Template dieses:

          Code:
          <xsl:template match="ARTNR">
            <xsl:copy-of select="."/>
            <IMAGE href="file://media/img/{ARTNR}.jpg"/>    
          </xsl:template>
          Zuletzt editiert von Thomas Meinike; 17.02.2011, 14:17.

          Comment


          • #6
            Hallo Thomas,

            sorry - ist auch in der ersten Version so...

            Anscheinend arbeitet die XML-Maschine in Indesign nicht besonders gut - plötzlich meldet das Programm zu Zeile "<xsl:template match="element()">" => "Ungültiges Muster"...??

            bei dem Versuch, als es lief, waren nur die Elemente ARTNR und IMAGE im Ausgabefile.

            ... habe die Sache mal mit Altova laufen lassen - alles vorhanden.

            Gibt es eine Empfehlung für ein Freeware-Tool für XLS-Konvertierungen?

            Gruss und Dank!

            Ingolf

            Comment


            • #7
              InDesign benutzt AFAIK auch nur einen 1.0-Prozessor, AltovaXML, Saxon arbeiten längst auf 2.0-Level.

              Verwende ggf. diesen 1.0-Code:

              Code:
              <?xml version="1.0" encoding="UTF-8"?>
              <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="@* | node()">
                  <xsl:copy>
                    <xsl:apply-templates select="@* | node()"/>
                  </xsl:copy>
                </xsl:template>
              
                <xsl:template match="ARTNR">
                  <xsl:copy-of select="."/>
                  <IMAGE href="file://media/img/{ARTNR}.jpg"/>    
                </xsl:template>
              
              </xsl:stylesheet>
              Freeware-Tool wäre der Standalone-Prozessor AltovaXML in der Community Edition oder Saxon-HE.

              Comment


              • #8
                wow - kommern der Sache näher!

                funzt im Id wunderbar - nu werden auch alle "alten" Elemente mit "übernommen"

                * {ARTNR} ist leer?
                * und Element IMAGE hat ein Abschlußtag bekommen (<IMAGE href="file://media/img/.jpg"></IMAGE>
) - macht das was??


                ... gibts ein PP-Konto für ein Freibier für Dich?


                Ingolf

                Comment


                • #9
                  Da stimmte die Ebene nicht mehr, also:
                  Code:
                  <IMAGE href="file://media/img/{../ARTNR}.jpg"/>
                  Das leere Element mit Schließtag ohne weiteren Inhalt ist aus formaler XML-Sicht ok.

                  Vielleicht macht es ID anders in dieser Form (finde ich gegenüber einem Einzeiler allerdings nicht empfehlenswert):
                  Code:
                  <xsl:element name="IMAGE">
                    <xsl:attribute name="href">
                      <xsl:value-of select="concat('file://media/img/',../ARTNR,'.jpg')"/>
                    </xsl:attribute>
                  </xsl:element>
                  Zuletzt editiert von Thomas Meinike; 17.02.2011, 17:14.

                  Comment


                  • #10
                    Statt
                    Code:
                    <xsl:template match="ARTNR">
                      <xsl:copy-of select="."/>
                      <IMAGE href="file://media/img/{ARTNR}.jpg"/>    
                    </xsl:template>
                    ist wohl
                    Code:
                    <xsl:template match="ARTNR">
                      <xsl:copy-of select="."/>
                      <IMAGE href="file://media/img/{.}.jpg"/>    
                    </xsl:template>
                    gesucht.

                    Comment


                    • #11
                      Bingo!!!!!!!!!!!!

                      ;-) ;-) ;-)

                      Ingolf

                      Comment


                      • #12
                        Statt ../ARTNR ist natürlich der direkte Zugriff auf den Kontextknoten (.) sinnvoller.

                        Comment

                        Working...
                        X