Announcement

Collapse
No announcement yet.

Problem mit XML-Namespaces und XSL

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

  • Problem mit XML-Namespaces und XSL

    Hallo,

    ich habe eine XML Datei und möchte diese mitteles XSL in eine neue XML Datei überführen. Da die Quelldatei mit verschiedenen Namespaces arbeitet habe ich aber das Problem, dass ich die verschiedenen Knoten nicht in der XSL Datei anprechen kann. Vielleicht kann mir ja jemand auf die Sprünge helfen, wie ich zugriff auf z.B. den Worksheet-Knoten bekomme.

    Bin für jeden Tipp dankbar.

    Code:
    <?xml version="1.0"?>
    
    <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
     xmlns:o="urn:schemas-microsoft-com:office:office"
     xmlns:x="urn:schemas-microsoft-com:office:excel"
     xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
     xmlns:html="http://www.w3.org/TR/REC-html40">
     
        <Worksheet ss:Name="Worksheet_Name">
    		<Table ss:ExpandedColumnCount="256" ss:ExpandedRowCount="9" x:FullColumns="1" x:FullRows="1">
    		  <Column ss:StyleID="s21" ss:AutoFitWidth="0" ss:Width="77.25" ss:Span="5"/>
    		  <Column ss:Index="7" ss:AutoFitWidth="0" ss:Width="77.25" ss:Span="249"/>
    		  <Row>
    			<Cell ss:StyleID="s22">
    			  <Data ss:Type="String">aaa</Data>
    			</Cell>
    			<Cell ss:StyleID="s22">
    			  <Data ss:Type="String">bbb</Data>
    			</Cell>
    			<Cell ss:StyleID="s22">
    			  <Data ss:Type="String">ccc</Data>
    			</Cell>
    			<Cell ss:StyleID="s22">
    			  <Data ss:Type="String">ddd</Data>
    			</Cell>
    		  </Row>
    	</Worksheet>
    ...
    </Workbook>

  • #2
    Worksheet befindet sich im Default-Namespace, welcher auch im XSLT-Stylesheet benötigt wird. Das im XML nicht definierte Prefix lässt sich frei wählen (im Folgenden ws). So gelingt z. B. der Zugriff auf das Worksheet-Attribut ss:Name:
    Code:
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:ws="urn:schemas-microsoft-com:office:spreadsheet"
      xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" exclude-result-prefixes="ss ws">
    
      <xsl:output method="xml" version="1.0" encoding="ISO-8859-1" indent="yes"/>
    
      <xsl:template match="ws:Worksheet"> 
        <test><xsl:value-of select="@ss:Name"/></test>  
      </xsl:template>
      
    </xsl:stylesheet>
    Ergebnis:
    Code:
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <test>Worksheet_Name</test>
    Hinweis: Unter XSLT 2.0 kann man den Default-Namespace mittels xpath-default-namespace bei xsl:stylesheet etwas komfortabler angeben:
    Code:
    <xsl:stylesheet version="2.0" ... xpath-default-namespace="urn:schemas-microsoft-com:office:spreadsheet">
    ...
    </xsl:stylesheet>

    Comment


    • #3
      Hallo Thomas,

      danke für deine Hilfe! Funktioniert jetzt super!

      Comment


      • #4
        ähnliches Problem mit xmlns und XSL

        Hallo Thomas,

        ich sitze hier schon etwas länger an diesem Problem und habe nach langer Suche im Internet endlich deinen Beitrag gefunden, der eigentlich genau mein Problem beschreibt oder besser gessagt die Lösung dazu.

        hier eine sehr abgespeckte Version meiner XML-Datei:
        Code:
        <?xml version="1.0" encoding="UTF-8"?>
        <root xmlns="http://www.beispiel.com/zuf/3.0"
        xmlns:pri="http://www.pmn.net/prn/PntI"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.pmn.net/prn/PrtI 
        Extended.xsd">
          <head>
            <version>3.0</version>
            <source supplier="xyz" application="EXE"/>
            <time>2008-05-28T10:49:57</time>
          </head>
          <body>
            <object action="put">
              <Issue/>
              <object_uid>
                <source supplier="xyz" application="EXE"/>
                <local_id>4047808362</local_id>
              </object_uid>
              <attributes>
                <Name>Werkstatt</Name>
                <pri:ShortLabel>WKM</pri:ShortLabel>
                <Date>2008-04-30</Date>
              </attributes>
            </object>
           </body>
         </imf>  
        mein eigentliches Problem liegt an zwei Stellen. Wenn ich die Namespaces weglasse kann meine XSL die Datei fast bearbeiten, wenn da nicht das pri-Präfix wäre.

        Nehme ich die Namespaces wieder rein, dann sind meine XPath-Abfragen immer leer. (z.B. root/head/source/@supplier)

        Wenn ich anderen Lösungansatz verfolge, komme ich ein bischen weiter, aber an einer anderen Stelle wieder durcheinander (geschachteltes for-each).
        Der andere Lösungsansatz sieht in etwa so aus:

        Code:
        node()[local-name()='root']/node()[local-name()='head'].....
        Ist vielleicht das gleiche Problem, aber irgendwie sehe ich es nicht.
        Jeder der die neusten Sourcen nimmt ist selber schuld.

        Comment


        • #5
          Das Stylesheet sollte so ausehen (Default-Namespace mit zuf-Prefix):
          Code:
          <?xml version="1.0" encoding="ISO-8859-1"?>
          <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:zuf="http://www.beispiel.com/zuf/3.0"
            xmlns:pri="http://www.pmn.net/prn/PntI"
            exclude-result-prefixes="zuf pri">
          
            <xsl:output method="xml" version="1.0" encoding="ISO-8859-1" indent="yes"/>
          
            <xsl:template match="/"> 
              <test><xsl:value-of select="zuf:root/zuf:head/zuf:source/@supplier"/></test>  
            </xsl:template>
            
          </xsl:stylesheet>
          Auf pri-Elemente dann entsprechend mit zuf:name/pri:name zugreifen.

          Comment


          • #6
            Vielen Dank

            Vielen Dank für die Hilfe!

            Perfekt, alles läuft super. Dabei hat doch schon alles in der Antwort davor gestanden.

            Wieso habe ich das eigentlich vorher nicht schon kapiert?
            Jeder der die neusten Sourcen nimmt ist selber schuld.

            Comment


            • #7
              Hallo zusammen.
              Ich habe ein weiteres Problem, das dem ersten hier sehr ähnlich ist. Leider schlagen alle Versuche das auf mein Problem zu übertragen fehl.
              Meine XML Datei sieht so aus (wurde generiert)
              Code:
              <?xml version="1.0" encoding="UTF-8"?>
              <xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:epc="de.fhoow.epc.tool" xmlns:notation="http://www.eclipse.org/gmf/runtime/1.0.1/notation">
                <epc:Epc xmi:id="_O4YkwE6aEd2dZJUWX1r4Zw">
                  <elements xmi:type="epc:Event" xmi:id="_hLkVUE6nEd2dZJUWX1r4Zw" name="Event Text"/>
                </epc:Epc>
                <notation:Diagram xmi:id="_O5R8oE6aEd2dZJUWX1r4Zw" type="Epc" element="_O4YkwE6aEd2dZJUWX1r4Zw" name="Test01.epc" measurementUnit="Pixel">
                  <children xmi:type="notation:Node" xmi:id="_hLuGUE6nEd2dZJUWX1r4Zw" type="1007" element="_hLkVUE6nEd2dZJUWX1r4Zw">
                    <children xmi:type="notation:Node" xmi:id="_hLuGU06nEd2dZJUWX1r4Zw" type="4004"/>
                    <styles xmi:type="notation:ShapeStyle" xmi:id="_hLuGUU6nEd2dZJUWX1r4Zw"/>
                    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_hLuGUk6nEd2dZJUWX1r4Zw" x="243" y="100"/>
                  </children>
                  <styles xmi:type="notation:DiagramStyle" xmi:id="_O5R8oU6aEd2dZJUWX1r4Zw"/>
                </notation:Diagram>
              </xmi:XMI>
              Nun versuche ich auf das Attribut xmi:id zuzugreifen und dieses nur erstmal auszugeben, das aber leider wegen des prefixes nicht funktioniert.
              Code:
              <?xml version="1.0" encoding="UTF-8"?>
              <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                  xmlns:epml="http://www.epml.de"
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xmlns:xmi="http://www.omg.de/XMI"
                  xmlns:epc="de.fhoow.epc.tool"
                  xmlns:notation="http://www.eclipse.org/gmf/runtime/1.0.1/notation"
                  exclude-result-prefixes="epc notation"
                  version="2.0">
              
              <xsl:output method="xml" indent="yes"/>
              
              .....
              
              <xsl:template match="notation:Diagram">
                  <xsl:value-of select="@name"/>
                  <xsl:value-of select="@id"/>
                  <xsl:value-of select="@xmi:id"/>
                  <xsl:value-of select="/attribute::xmi:id"/>
                  <xsl:element name="directory">
                      <xsl:attribute name="name">Root</xsl:attribute>        
                      <xsl:for-each select="children">
                          <xsl:text>Kind gefunden.</xsl:text>
                          <xsl:value-of select="@xmi:id"/>
                      </xsl:for-each>
                  </xsl:element>
              </xsl:template>
              </xsl:stylesheet>
              Das name Attribut Zeile 1 wird ausgegeben aber alle value-of dahinter nicht mehr. Die Schleife scheint auch wieder zu funktionieren.
              Das Problem kann eigentlich nur an einem namespace liegen, aber ich beschäftige mich erst seit 2 Tagen mit xslt und verstehe das nicht...

              Vielleicht kann mir hier wer weiterhelfen.

              Comment


              • #8
                Das Attribut xmi:id kann nicht abgefragt werden, da der xmi-Namensraum nicht explizit beim notationiagram-Element deklariert wurde, denn vererbt werden Namensräume nur für Elemente.

                Deklariere den xmi-NS entweder so beim jeweiligen Element:
                Code:
                <notation:Diagram xmlns:xmi="http://www.omg.de/XMI" xmi:id="_O5R8oE6aEd2dZJUWX1r4Zw" ...>
                ...
                </notation:Diagram>
                und frage dann @xmi:id ab oder verwende diese Schreibweise @*[name()='xmi:id'].

                Comment


                • #9
                  Danke dir.
                  Die Ausgangsdatei kann ich nicht verändern, da sie generiert wird, aber die die Abfrage über die Namensfunktion funktioniert.

                  Comment

                  Working...
                  X