Maxi: saxon 8.7 xsl-Transformation

Ich versuche gerade mit dem transform-Befehl des Saxon 8.7 xslt-Prozessors die folgende Datei zu transformieren.

<MitarbeiterHervorholen.Response xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://intalio.com/connectors/jdbc" xmlns:axis2ns20="http://intalio.com/connectors/jdbc">
 <rows>
  <row>
   <Name>Andreas M?ller</Name>
   <Personalnummer>2</Personalnummer>
  </row>
  <row>
   <Name>Klaus Schuster</Name>
   <Personalnummer>3</Personalnummer>
  </row>
 </rows>
</MitarbeiterHervorholen .Response>

Dafür verwende ich die folgende xsl-Datei:

transform.xsl

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
  <xsl:output method="xml"/>
  <xsl:template match="rows">
     <items>
         <xsl:for-each select="row">
       <item>
        <label>
         <xsl:value-of select="Name"/>
        </label>
        <value>
         <xsl:value-of select="Personalnummer"/>
        </value>
       </item>
         </xsl:for-each>
     </items>
  </xsl:template>
</xsl:stylesheet>

Eigentlich dachte ich, dass das Ergebnis so aussehen würde:

<?xml version="1.0" encoding="UTF-8"?>
<items>
 <item>
  <label>Andreas M?ller</label>
  <value>2</value>
 </item>
 <item>
  <label>Klaus Schuster</label>
  <value>3</value>
 </item>
</items>

Leider sieht das Ergebnis so aus:

<?xml version="1.0" encoding="UTF-8"?>

Andreas M?ller
            2

Klaus Schuster
            3

Ich weiß nicht was ich falsch gemacht habe und hoffe, dass mir jemand helfen kann.

  1. Hi,

    Ich weiß nicht was ich falsch gemacht habe und hoffe, dass mir jemand helfen kann.

    Du hast kein Template, was Dein root-Element matcht, weswegen das zu Problemen führt. Füge noch so etwas ein:

    <xsl:template match="/MitarbeiterHervorholen.Response">  
      <xsl:apply-templates />  
    </xsl:template>
    

    Dann sollte es funktionieren.

    Btw. Warum XSLT 1.0 mit Saxon 8? Wäre da nicht XSLT 2.0 angebrachter?

    Viele Grüße,
    Christian

    1. Hi,

      Ich weiß nicht was ich falsch gemacht habe und hoffe, dass mir jemand helfen kann.

      Du hast kein Template, was Dein root-Element matcht, weswegen das zu Problemen führt. Füge noch so etwas ein:

      <xsl:template match="/MitarbeiterHervorholen.Response">

      <xsl:apply-templates />
      </xsl:template>

      
      >   
      > Dann sollte es funktionieren.  
      >   
      > Btw. Warum XSLT 1.0 mit Saxon 8? Wäre da nicht XSLT 2.0 angebrachter?  
      >   
      > Viele Grüße,  
      > Christian  
      >   
        
      Das funktioniert leider nur wenn ich die namespace Deklarationen in dem MitarbeiterHervorholen.Response Tag lösche. Trotzdem danke ich dir für deine Hilfe.
      
  2. Hallo Maxi,

    Ich weiß nicht was ich falsch gemacht habe und hoffe, dass mir jemand helfen kann.

    Dein Problem liegt im Default-Namespace des XML-Dokuments (xmlns="http://intalio.com/connectors/jdbc"). Diesen musst Du auch im XSLT-Stylesheet deklarieren und verwenden, konkret mit einem Dummy-Prefix, z. B. jdbc:

    <?xml version="1.0" encoding="UTF-8"?>  
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"  
     xmlns:jdbc="http://intalio.com/connectors/jdbc" exclude-result-prefixes="jdbc">  
      
      <xsl:output method="xml"/>  
      
      <xsl:template match="jdbc:rows">  
        <items>  
          <xsl:for-each select="jdbc:row">  
            <item>  
              <label>  
                <xsl:value-of select="jdbc:Name"/>  
              </label>  
              <value>  
                <xsl:value-of select="jdbc:Personalnummer"/>  
              </value>  
            </item>  
          </xsl:for-each>  
        </items>  
      
      </xsl:template>  
      
    </xsl:stylesheet>
    

    Klappt bei mir so mit Saxon 9.0B und AltovaXML 2008. Das Stylesheet besser zu strukturien (siehe die Antwort von Christian) kann natürlich nicht schaden, ebenso der Hinweis auf XSLT 2.0. Wenn man es haben kann, wird man sich nicht nach 1.0 zurück sehen ;-).

    Grüße,
    Thomas

    1. [Nachtrag:]

      Bei Verwendung von XSLT 2.0 würde <xsl:stylesheet ... xpath-default-namespace="..."> ausreichen und man müsste das Prefix nicht mehr überall angeben:

      <?xml version="1.0" encoding="ISO-8859-1"?>  
      <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
        xpath-default-namespace="http://intalio.com/connectors/jdbc">  
        
        <xsl:output method="xml" version="1.0"/>  
        
        <xsl:template match="rows">  
          <items>  
            <xsl:for-each select="row">  
              <item>  
                <label>  
                  <xsl:value-of select="Name"/>  
                </label>  
                <value>  
                  <xsl:value-of select="Personalnummer"/>  
                </value>  
              </item>  
            </xsl:for-each>  
          </items>  
        
        </xsl:template>  
        
      </xsl:stylesheet>
      

      Grüße,
      Thomas

    2. Hallo Maxi,

      Ich weiß nicht was ich falsch gemacht habe und hoffe, dass mir jemand helfen kann.

      Dein Problem liegt im Default-Namespace des XML-Dokuments (xmlns="http://intalio.com/connectors/jdbc"). Diesen musst Du auch im XSLT-Stylesheet deklarieren und verwenden, konkret mit einem Dummy-Prefix, z. B. jdbc:

      <?xml version="1.0" encoding="UTF-8"?>

      <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
      xmlns:jdbc="http://intalio.com/connectors/jdbc" exclude-result-prefixes="jdbc">

      <xsl:output method="xml"/>

      <xsl:template match="jdbc:rows">
          <items>
            <xsl:for-each select="jdbc:row">
              <item>
                <label>
                  <xsl:value-of select="jdbc:Name"/>
                </label>
                <value>
                  <xsl:value-of select="jdbc:Personalnummer"/>
                </value>
              </item>
            </xsl:for-each>
          </items>

      </xsl:template>

      </xsl:stylesheet>

      
      >   
      > Klappt bei mir so mit Saxon 9.0B und AltovaXML 2008. Das Stylesheet besser zu strukturien (siehe die Antwort von Christian) kann natürlich nicht schaden, ebenso der Hinweis auf XSLT 2.0. Wenn man es haben kann, wird man sich nicht nach 1.0 zurück sehen ;-).  
      >   
      > Grüße,  
      > Thomas  
        
      Ich verwende den Intalio|BPMS Designer. Das Ergebnis der select query soll in eine Combo Box gemapped werden. In dem Beispiel, das sie auf ihrer Website anbieten, mappen sie die Daten von einem xform in ein anderes. Dabei verwenden sie den Saxon XSLT Prozessor 1.0. und alles funktioniert sehr gut. Leider funktioniert es bei meiner select query nicht Ich kann leider an der response message nichts ändern, weil diese dynamisch generiert wird. Ich kann nur versuchen diese Nachricht für den XSLT-Prozessorn so aufzubereiten, dass sie in die Combo Box gemapped wird.