mario: Gültiger XPATH Ausdruck verursacht Fehler (XSLT)

Hallöchen allerseits,

Ich möchte eine XML Transformaion mit XSLT durchführen. Ich habe folgende Source-Datei:

  
<?xml version="1.0" encoding="UTF-8"?>  
<?xml-stylesheet href="test.xsl" type="text/xsl" ?>  
<uiModel>  
    <cuiModel id="Home" name="Home">  
        <window id="container" name="container"  
             width="" height="" bgColor="" repetition="">  
            <gridBagBox id="grid_bag_box" name="grid_bag_box"  
                gridHeight="" gridWidth="">  
                <constraint gridx="" gridy="" gridwidth=""  
                    gridheight="" weightx="" weighty=""  
                    fill="" insets="">  
                    <box id="headerBox" width="" height="" bgImage="" bgColor="" isVisible="">  
                <imageComponent id="logo" imageHeight="" imageWidth="" imageBorder="" isVisible=""/>  
                         <outputText id="hdText" name="hdText" isVisible="" isEnabled=""  
                                     isBold="" textMargin="" context="" textFont="" textSize=""  
                                     textColor="" isItalic="" isUnderlined="" content=""/>  
                         <imageComponent id="betaVersion" imageHeight="" imageWidth="" imageBorder="" isVisible=""/>  
                    </box>  
                </constraint>  
             </gridBagBox>  
        </window>  
    </cuiModel>  
</uiModel>  

und folgende XSL Datei:

  
<?xml version="1.0" encoding="ISO-8859-1"?>  
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
 <xsl:template match="node()|@*">  
  <xsl:copy>  
   <xsl:apply-templates select="node()|@*"/>  
  </xsl:copy>  
 </xsl:template>  
  
       <xsl:template match="//*[@id='map']/../../@gridwidth">  
            <xsl:attribute name="gridwidth">3</xsl:attribute>  
       </xsl:template>  
</xsl:stylesheet>  

Wenn ich die XSL auf die Source XML loslasse, knallt es bei der XPATH Anweisung im 2. templatematch-tag "//*[@id='map']/../../@gridwidth"

Ziel des ganzen ist es die Source XML zu kopieren und nur ein attribut wert zu ändern. In diesem konkreten Beispiel wäre es die gridwidth des constraints tags, in welcher das Element mit der id='map' ist.

Ich kann das Auftreten des Fehlers nicht ganz nachvollziehen, zumal der XPATH Ausdruck "//*[@id='map']/../../@gridwidth" voll und ganz korrekt ist!

Kann mir hier vielleicht jemand weiterhelfen?

Vielen DAnk im Voraus,
Mario

  1. Hi,

    <xsl:template match="//*[@id='map']/../../@gridwidth">

    Du suchst das gridwidth-Attribut eines Elements, dessen Enkel die id map hat?

    Das würde ich so probieren:

    match="//*[*/*/@id='map']/@gridwidth"

    (daß in Deinem XML kein Element mit id="map" vorkommt, hast Du berücksichtigt?)

    Wenn ich die XSL auf die Source XML loslasse, knallt es bei der XPATH Anweisung im 2. templatematch-tag "//*[@id='map']/../../@gridwidth"

    Dann dreh den Lautsprecher ab. (Oder sag, was "knallt" bedeutet - genauer Text der Fehlermeldung, interessant wäre auch, welcher XSLT-Prozessor benutzt wird.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. Hallo Andreas, danke für deine Hilfe! Deine XPATH-Anweisung hat auch wunderbar geklappt. Weißt du zufällig, warum meine Version nicht klappt? Unten ein paar Anmerkungen!
      Grüße, mario

      Hi,

      <xsl:template match="//*[@id='map']/../../@gridwidth">

      Du suchst das gridwidth-Attribut eines Elements, dessen Enkel die id map hat?

      Das ist genau das, was ich machen will

      Das würde ich so probieren:

      match="//*[*/*/@id='map']/@gridwidth"

      »»
      Das klappt auch!

      (daß in Deinem XML kein Element mit id="map" vorkommt, hast Du berücksichtigt?)

      Eigentlich gibt es eins. Hatte es nur vergessen reinzukopieren!
      Stell di einfach vor
      <imageComponent id="logo" imageHeight="" imageWidth="" imageBorder="" isVisible=""/>
      ist eigentlich
      <imageComponent id="map" imageHeight="" imageWidth="" imageBorder="" isVisible=""/>

      Wenn ich die XSL auf die Source XML loslasse, knallt es bei der XPATH Anweisung im 2. templatematch-tag "//*[@id='map']/../../@gridwidth"

      Dann dreh den Lautsprecher ab. (Oder sag, was "knallt" bedeutet - genauer Text der Fehlermeldung, interessant wäre auch, welcher XSLT-Prozessor benutzt wird.

      Sorry für die ungenaue Beschreibung. Ich mache das ganze mit der javax.xml.transform library. ICh weiss gar nciht welchen Prozessor die benutzt. Folgende Fehlermeldung wird ausgespuckt.

      FEHLER:  'Syntaxfehler in '//*[@id='map']/../../@gridwidth'.'
      SCHWER WIEGENDER FEHLER:  'Die Formatvorlage konnte nicht kompiliert werden.'
      javax.xml.transform.TransformerConfigurationException: Die Formatvorlage konnte nicht kompiliert werden.
       at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTemplates(Unknown Source)
       at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTransformer(Unknown Source)
       at XSLTBuilder.transform(XSLTBuilder.java:80)
       at Dummy.main(Dummy.java:72)

      cu,
      Andreas

      1. Hallo,

        Sorry für die ungenaue Beschreibung. Ich mache das ganze mit der javax.xml.transform library. ICh weiss gar nciht welchen Prozessor die benutzt. Folgende Fehlermeldung wird ausgespuckt.

        Du siehst die Fehlermeldung und weißt nicht welcher Prozessor benutzt wird?

        Autsch!!!

        FEHLER:  'Syntaxfehler in '//*[@id='map']/../../@gridwidth'.'
        SCHWER WIEGENDER FEHLER:  'Die Formatvorlage konnte nicht kompiliert werden.'
        javax.xml.transform.TransformerConfigurationException: Die Formatvorlage konnte nicht kompiliert werden.
        at com.sun.org.apache.xalan. ...

        ^^^^^^^^^^

        Weißt du zufällig, warum meine Version nicht klappt?

        Weill die zwei Punkte ".." nicht der Definition von Pattern (Muster) entsprechen, die für das match-Attribut von Templates vorgeschrieben sind.

        Grüße
        Thomas

  2. Hallo Mario,

      
    
    >        <xsl:template match="//*[@id='map']/../../@gridwidth">  
    
              ^^^ Vermutlich suchst Du:  
              <xsl:template match="//*[@id='map' and ../../@gridwidth]">  
    
    >          <xsl:attribute name="gridwidth">3</xsl:attribute>  
    >        </xsl:template>
    
    

    Grüße,
    Thomas