Announcement

Collapse
No announcement yet.

XML mit Namensraum

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

  • XML mit Namensraum

    Hi,

    ich bin XSLT-Anfänger und am Üben. Ich habe folgendes Problem bei einer xml-Datei der Form:

    Code:
    <jm:Model name="Model" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    standardNamespace="de.test.apps.model" 
    xmlns:jm="http://www.meineDomain.de/domain/testMeta/2.0"
    />
    
    ...
    wie man sieht, steht vor jedem Tag der Namensraum "jm" und das ist überall in der Datei so und jm steht vor jedem Tag davor. Meine Frage ist nun: wie soll eine XSLT-Datei aussehen, um z.B. das Attribut "name" von "jm:Model" ausgelesen werden kann?

    Danke im Voraus.

  • #2
    In deinem Code ist "jm" ein Präfix, der Namensraum, der an diesen Präfix gebunden ist, ist "http://www.meineDomain.de/domain/testMeta/2.0".
    Mit XSLT kannst du damit so arbeiten:
    [highlight=xml]
    <xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0"
    xmlns:jm="http://www.meineDomain.de/domain/testMeta/2.0"
    exclude-result-prefixes="jm">

    <xsl:template match="jm:Model">
    <xsl:value-of select="@name"/>
    </xsl:template>

    </xsl:stylesheet>
    [/highlight]

    Comment


    • #3
      Hallo Martin,

      vielen Dank für deine Antwort. Es funktioniert. Gibt es eventuell eine Möglichkeit irgendwie "jm" global zu definieren, damit in XSLT-Datei nicht überall "jm:" steht?

      Kannst du mir bitte auch sagen, wie ich eine Variable in Variable ausgeben kann?

      <xsl:variable name="docName" select="myFile.xml"/>
      <xsl:variable name="rootName" select="document('$docName')/File/Root/@name"/>
      So funktioniert es nämlich nicht (auch ohne '').

      Gruß

      Comment


      • #4
        XSLT 2.0 bietet dafür xpath-default-namespace="…" beim xsl:stylesheet-Element.

        Bezüglich der Variable: Schreibe diese nicht in einen String, sondern ohne die Anführungszeichen, dafür aber select="'myFile.xml'" als String, sonst wäre das die Selektion eines Elements myFile.xml.

        Comment


        • #5
          Hallo Thoams,

          vielen Dank. Das mit xpath-default-namespace="jm" funktioniert bei mir nicht ganz. Ih habe die Version auch auf 2.0 umgestellt, aber trotzdem ohen "jm:" wird nichts mehr angezeigt.

          Gruß

          Comment


          • #6
            Verwende xpath-default-namespace="http://www.meineDomain.de/domain/testMeta/2.0" (und nicht das NS-Präfix). Zudem muss auch ein XSLT 2.0-fähiger Prozessor wie AltovaXML oder Saxon eingesetzt werden.

            Comment


            • #7
              Hallo Thomas,

              es sieht jetzt besser aus, funktioniert aber mein "document" (bzw. documentsvariable) nicht mehr. Sollte es da irgendwelche Einschränkungen geben?

              Gruß

              Comment


              • #8
                Wenn du in einem Stylesheet mehrere Dokumente verarbeitest, von denen eines einen Namensraum benutzt, das andere aber nicht, dann kannst du xpath-default-namespace natürlich nicht in gesamten Stylesheet einsetzen, denn so wird überall der default namespace angenommen.
                Es mag reichen, aus
                Code:
                <xsl:variable name="docName" select="'myFile.xml'"/>
                <xsl:variable  name="rootName" select="document($docName)/File/Root/@name"/>
                etwa
                Code:
                <xsl:variable name="docName" select="'myFile.xml'"/>
                <xsl:variable xpath-default-namespace="" name="rootName" select="document($docName)/File/Root/@name"/>
                zu machen, aber generell würde ich eher empfehlen, doch mit Präfixen für die Elemente zu arbeiten, die sich in einem Namensraum befinden, das bleibt übersichtlicher und besser wartbar, als wenn man an einer Stelle einen xpath-default-namespace hat, denn aber dann an anderen Stellen wieder überschreiben muss.

                Comment


                • #9
                  Hallo,

                  vielen Dank. Alles funktioniert nun richtig. Aber da meine Fragen kein Ende haben :-), möchte ich dich gerne noch eine Frage stellen:

                  Im XML-Datei stehen Variablentypen in Form:

                  Code:
                  <Attribute name="RecordName">
                     <Stereotype name="Property" />
                     <Type name="StringType" id="AAE95" xsi:type="StringType" isPrimitiveType="true" isElementaryType="true" />
                     </Attribute>
                  Wie man sieht, steht der Typ hier als z.B. "StringType" und nicht als "string". Ich habe in meinem document so etwas definiert:

                  Code:
                  <Root>
                  	<Attribute>
                  		<Type key="StringType" value="string" />
                                  <Type key="..." value="..." />
                                  <Type key="..." value="..." />
                  	</Attribute>
                  </Root>
                  Wie kann man nun am Sinnvollsten an den Wert (value) kommen? Ich meine, ich habe vor, alle Typen durchzugehen, wenn key="StringType" dann den Wert "string" ausgeben. Muss da auf jeden Fall eine foreach-Schleife eingesetzt werden?

                  Gruß

                  Comment


                  • #10
                    Hi,

                    es hat sich erledigt.

                    http://stackoverflow.com/questions/1...y-and-document

                    Gruß

                    Comment


                    • #11
                      Grundsätzlich empfiehlt sich zur Auflösung von Querverweisen der Einsatz von xsl: key und dann die Benutzung der "key"-Funktion, also etwa
                      Code:
                      <xsl:key name="map-types" match="Root/Attribute/Type" use="@key"/>
                      und dann
                      Code:
                      <xsl:template match="Attribute/Type">
                        <xsl:value-of select="key('map-types', @name)"/>
                        ...
                      </xsl:template>
                      Beachte, dass keys per Dokument gültig sind, so du also das zweite Beispiel in einem anderen Dokument hast, musst du beim Aufruf der key-Funktion das Dokument mit angeben, also
                      Code:
                      <xsl:variable name="type-doc" select="document('types.xml')"/>
                      
                      
                      <xsl:template match="Attribute/Type">
                        <xsl:value-of select="key('map-types', @name, $type-doc)"/>
                        ...
                      </xsl:template>
                      Alle diese Beispiele in diesem Post nehmen an, dass keine Namensräume verwendet werden, so das dennoch der Fall ist, muss man halt diese im Stylesheet deklarieren und entsprechend bei den XSLT-Pattern und in XPath-Ausdrücken verwenden, um Elementnamen zu qualifizieren.

                      Comment

                      Working...
                      X