Softwaretechnik-Blog

Montag, Januar 25, 2010

 

Beim Zugriff auf Elemente eines Nodeset per [x] auf Datentyp von x achten

Manchmal verstecken sich Fehler sehr gut. Im folgendem Code hat sich ein solcher Fehler versteckt:

...
   <xsl:variable name="position">
      <xsl:value-of select="count(preceding::bar)+1"/>
   </xsl:variable>
   <xsl:apply-templates select="$my-node-set[$position]"/>
...

Der Code oben soll die Anzahl von bar-Elementen zählen und dann aus dem Nodeset $my-node-set das Element verarbeiten, dass an der Position steht, die der Anzahl bar-Elemente entspricht.

Von der Variablen "position" könnte man dabei zunächst annehmen, dass sie eine Zahlenangabe repräsentieren würde. Wie man beim Ausführen des Codes bemerken würde, ist dies allerdings nicht der Fall. Es wird aus der Variablen $my-node-set stets der erste Knoten gewählt.

Tatsächlich ist position vom Typ String und muss bevor er mit [] verwendet werden kann in eine Zahl transformiert werden. So ist es richtig:

...

   <xsl:variable name="position">
      <xsl:value-of select="count(preceding::bar)+1"/>
   </xsl:variable>
   <xsl:apply-templates select="$my-node-set[number($position)]"/>
...


Mit number() wird aus dem String eine Zahl und dann klappt der Zugriff auf den Knoten im Nodeset an der gewünschten Stelle.

Labels: , ,


Sonntag, Januar 24, 2010

 

Was tun, wenn xsl:attribute name="xmlns" nicht geht?

Man kann in einer XSLT einem Element kein namespace-Attribut zuweisen. Der folgende Versuch schlägt fehl: <xsl:attribute name="xmlns"> Warum dies so ist, erklärt Jeni Tennison (http://www.biglist.com/lists/xsl-list/archives/200102/msg00656.html).

Sie schlägt verschiedene Alternativen vor, erwähnt allerdings nicht die XSLT 2.0-Variante:

  <xsl:namespace name="bar" select="'http://bar.com/foo1'"/>
bzw.
  <xsl:namespace name="" select="'http://bar.com/foo'"/>

mit denen zum Wurzelelement des erzeugten Ergebnisdokumentes ein Default-Namespace xmlns="http://bar.com/foo" und der Namespace xmlns:bar="http://bar.com/foo1" erzeugt werden.

Labels: , ,


Donnerstag, Januar 21, 2010

 

Leere Elemente in XSD

Ein leeres Element erzeugt man in einem XML-Schema nicht mit:

  <xs:element name="keinLeeresElement"/>

sondern mit:

  <xs:element name="einLeeresElement">
     <xs:complexType/>
  </xs:element>

Labels: ,


Sonntag, Januar 17, 2010

 

In XSL testen, ob unmittelbar vorhergehendes Element einen bestimmten Typ hat

Wie kann bei einer XSL-Transformation testen, ob das unmittelbar vorausgehende XML-Element eines Input-Dokumentes einen bestimmten Typ hat? Im folgenden Beispiel (Transformation von Open Office in XSL-FO) wird geprüft, ob das vorhergehende Element vom Typ "text:bookmark-start" ist.

  <xsl:if test="not(preceding-sibling::node()[1][self::text:bookmark-start])">
    <!-- das unmittelbar vorhergehende Element ist kein Bookmark -->
  </xsl:if>

Labels:


Archives

This page is powered by Blogger. Isn't yours?

Haftungsausschluss:
Alle Ausführungen und Inhalte auf dieser Website sind gewissenhaft erarbeitet worden. Dennoch kann weder die inhaltliche Richtigkeit, noch die Übereinstimmung mit den tatsächlichen Bedürfnissen des Nutzers der hier dargestellten Ausführungen und Inhalte garantiert werden. Der Nutzer der hier dargestellten Ausführungen und Inhalte verpflichtet sich, sie vor ihrer Verwendung inhaltlich auf Richtigkeit und auf Eignung für den konkreten Einsatzzweck zu prüfen. Es kann keine Gewährleistung für die rechtliche oder technische Wirksamkeit der Ausführungen und Inhalte übernommen werden - insbesondere können hieraus auch keine haftungsrelevanten Ansprüche hergeleitet werden.