Yann: XSLT: eingebettete Angabe von Variablen

Hallo Leute

Ich bin ein XSLT-Newbie und habe ein kleines Problem :-(

Grundsätzlich: Ich möchte per XSLT eine Abfrage in Oracle machen, was soweit auch funktioniert. Nur möchte ich nun die Abfrage (genauer: Die WHERE-Angabe) über einen XML-Input befüllen und hier streikt es.

Zuerst mal das XML mit den Angaben für das WHERE:

<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>

<querydata>
	<code>CH1003601234500000000000000001294</code>
</querydata>

Hier noch das XSLT:

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:sql="http://saxon.sf.net/sql" 
    extension-element-prefixes="sql">
    
    <xsl:output method="xml" media-type="text/xml" encoding="UTF-8" indent="yes"/>
    <xsl:variable name="mc">
		<xsl:value-of select="/querydata/code"/>
	</xsl:variable>
    <xsl:param name="database" select="'jdbc:oracle:thin:@omsrvvm72:1521:OMORCL11T'"/>
    <xsl:param name="user" select="'belvis1307'"/>
    <xsl:param name="password" select="'12years'"/>
    <xsl:param name="driver" select="'oracle.jdbc.OracleDriver'"/>
    
    <xsl:variable name="connection" as="java:java.sql.Connection" xmlns:java="http://saxon.sf.net/java-type">
        
        <sql:connect driver="{$driver}" database="{$database}" user="{$user}" password="{$password}">
            <xsl:fallback>
                <xsl:message terminate="yes">SQL extensions are not installed</xsl:message>
            </xsl:fallback>
        </sql:connect>
    </xsl:variable>
    
    <xsl:template match="/" name="main">
        <xsl:if test="not(element-available('sql:connect'))">
            <xsl:message>sql:connect is not available</xsl:message>
        </xsl:if>
        <sql:query connection="$connection" table="v_sd_entnahme" column="$meteringcode_s,name_kd_s" where="meteringcode_s='$mc'" row-tag="row" column-tag="col"/>
    </xsl:template>
    
</xsl:stylesheet>

Wie Ihr seht, versuche ich im oberen Bereich den Wert aus /querydata/code auszulesen und in eine Variable zu packen, welche ich dann unten dem sql:query im Attribut "Where" mit angebe.

Leider scheint dies so nicht zu funktionieren, ich erhalte vom Oracle immer einen Fehler "ungültiges Zeichen".

Habe ich das so richtig gemacht? Oder wie würdet Ihr das machen?

Liebe Grüsse Yann

  1. Okay, Tippfehler von mir, es sollte "meteringcode_s, ..." heissen, da hatte sich ein $-Zeichen eingeschlichen.

    Nun läuft die Transformation durch, aber die output.xml enthält keine Daten, also muss etwas mit der Variablen-Übergabe noch falsch sein :-(

    Gruss, Yann

    1. Hallo Yann,

      Okay, Tippfehler von mir, es sollte "meteringcode_s, ..." heissen, da hatte sich ein $-Zeichen eingeschlichen.

      Nun läuft die Transformation durch, aber die output.xml enthält keine Daten, also muss etwas mit der Variablen-Übergabe noch falsch sein :-(

      Die $Parameter / $Variablen müssen bei der Ausgabe innerhalb von Attributen in {} stehen. Kommt ja auch teilweise vor. Der konkrete Problembereich sollte (ohne Detailkenntnisse Verarbeitung) so aussehen:

      <sql:query connection="{$connection}" table="v_sd_entnahme" column="meteringcode_s,name_kd_s" where="meteringcode_s='{$mc}'" row-tag="row" column-tag="col"/>
      

      Grüße,
      Thomas

      1. Hallo Thomas,

        das hatte ich auch schon mal probiert, ohne das es geklappt hat, aber irgendetwas muss ich da noch "verhunzt" haben. Hab mein Script von hier kopiert (den Tippfehler ausgebessert natürlich) und innerhalb der Where "{$mc}" und siehe da -> es funktioniert! :-)))

        Danke für den Hinweis!

        Gruss, Yann

        1. Hallo Yann,

          das hatte ich auch schon mal probiert, ohne das es geklappt hat, aber irgendetwas muss ich da noch "verhunzt" haben. Hab mein Script von hier kopiert (den Tippfehler ausgebessert natürlich) und innerhalb der Where "{$mc}" und siehe da -> es funktioniert! :-)))

          Die Nicht-Notwendigkeit der '' bei $mc konnte ich nicht einschätzen, aber bei $connection müssten auch die {}-Klammern hin, denn sonst steht da wirklich der String $connection in der Ausgabe. Wenn es dennoch funktioniert, gibt es dafür vielleicht einen Defaultwert.

          Grüße,
          Thomas