Announcement

Collapse
No announcement yet.

Wert aus XSD auslesen

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

  • Wert aus XSD auslesen

    Hallo,

    ich habe mir schon einen Wolf gegoogelt, möglich dass es auch nicht möglich ist. Folgender Wunsch wurde an mich geäussert, und mit meinen spärlichen XSLT Kenntnissen bekomme ich es nicht gebacken.
    Ich habe in XML welches bereits über ein XSLT läuft und die Daten in eine ansehnliche Tabellenform bringt, somit ist dem Anwender schon mal geholfen. Nun existieren aber Werte die normalisiert sind, mit denen der Anwender nichts anfangen kann. In einer XSD Datei, ist definiert das der Wert "0815" z.B. München entspricht. Nun würde ich gerne statt 0815 München darstellen. Ist das überhaupt möglich, und wenn ja welche Richtung muss ich einschlagen.

    Danke

  • #2
    Zeig uns mal die relevanten Auszüge aus dem Schema, dem XSLT das du schon hast und dem Ausgabeformat, das du willst.

    Comment


    • #3
      Hallo Martin,

      ich denke mal, dass das eigentlich kein großes Hexenwerk ist, wenn es denn mit xslt möglich ist ...
      Ich habe bereits eine einfache HTML Tabelle zusammen, mit Value of geben ich den Wert 9A0000 aus, der in der XML hinterlegt ist.
      Anstelle des Wertes soll nun ZZ Test-Bund erscheienen ...


      <?xml version="1.0" encoding="UTF-8"?>
      <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://www.xjustiz.de" targetNamespace="http://www.xjustiz.de" version="1.12.0" elementFormDefault="qualified" attributeFormDefault="unqualified">
      <xs:annotation>
      <xs:documentation>Diese Datei ist Bestandteil des Dokumentformats XJustiz. Einzelheiten zu Aufgabe und Funktionsweise können der technischen Dokumentation entnommen werden. Diese steht unter http://www.xjustiz.de zum Abruf bereit. Die vorliegende Datei stellt die Codeliste mit den Gerichtskennzahlen bereit.</xs:documentation>
      </xs:annotation>
      <xs:include schemaLocation="xj_0001_basistypen_1_0.xsd" />
      <xs:complexType name="WL_Gerichte">
      <xs:complexContent>
      <xs:restriction base="tns:WLT_String">
      <xs:sequence>
      <xs:element name="content">
      <xs:simpleType>
      <xs:restriction base="xs:token">
      <xs:enumeration value="9A0000">
      <xs:annotation>
      <xs:appinfo>
      <codeName>ZZ Test-Bund</codeName>
      </xs:appinfo>
      </xs:annotation>
      </xs:enumeration>

      Gruß

      Comment


      • #4
        Dann definiere einen key

        Code:
        <xsl:stylesheet
          xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
          xmlns:xs="http://www.w3.org/2001/XMLSchema"
          xmlns:tns="http://www.xjustiz.de" 
          exclude-result-prefixes="xs tns"
          version="2.0">
        
        <xsl:param name="schema-url" select="'schema.xsd'"/>
        
        <xsl:variable name="schema-doc" select="document($schema-url)"/>
        
        <xsl:key name="k1" match="xs:element[@name = 'content']//xs:enumeration/xs:annotation/xs:appinfo/codeName"
          use="ancestor::xs:enumeration/@value"/>
        
        <xsl:template match="tns:content">
          <!-- statt xsl:value-of select="."  dann -->
          <xsl:value-of select="key('k1', ., $schema-doc)"/>
        </xsl:template>
        
        ...
        </xsl:stylesheet>
        Das ist dann XSLT 2.0 und funktioniert mit XSLT 2.0 Prozessoren wie Saxon 9, AltovaXML oder XmlPrime.

        Mit XSLT 1.0 braucht man etwas mehr Code, da die "key"-Funktion kein drittes Argument mit dem Kontextdokument kennt. Lass uns wissen, ob du XSLT 1.0 oder 2.0 Code brauchst.
        Zuletzt editiert von Martin Honnen; 11.11.2012, 19:15. Reason: Tippfehler im Code korrigiert

        Comment


        • #5
          Ach herje, soweit bin ich noch nicht in meinem Buch, das Teil soll lediglich im aktuellen MS Internet Explorer dargestellt werden ... damit der Benutzer eine Übersicht hat was weggesendet wird. Aber damit kann ich schon mal was anfangen. Danke

          Comment


          • #6
            Browser können nur XSLT 1.0, da muss man dann per for-each select="$schema-doc" das Kontextdokument ändern, da keys immer nur für ein Dokument berechnet werden:

            Code:
            <xsl:stylesheet
              xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
              xmlns:xs="http://www.w3.org/2001/XMLSchema"
              xmlns:tns="http://www.xjustiz.de" 
              exclude-result-prefixes="xs tns"
              version="1.0">
            
            <xsl:param name="schema-url" select="'schema.xsd'"/>
            
            <xsl:variable name="schema-doc" select="document($schema-url)"/>
            
            <xsl:key name="k1" match="xs:element[@name = 'content']//xs:enumeration/xs:annotation/xs:appinfo/codeName"
              use="ancestor::xs:enumeration/@value"/>
            
            <xsl:template match="tns:content">
              <xsl:variable name="this-content" select="."/>
              <!-- statt xsl:value-of select="."  dann -->
              <xsl:for-each select="$schema-doc">
                <xsl:value-of select="key('k1', $this-content)"/>
              </xsl:for-each>
            </xsl:template>
            
            ...
            </xsl:stylesheet>
            Ansonsten ohne key
            Code:
            <xsl:stylesheet
              xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
              xmlns:xs="http://www.w3.org/2001/XMLSchema"
              xmlns:tns="http://www.xjustiz.de" 
              exclude-result-prefixes="xs tns"
              version="1.0">
            
            <xsl:param name="schema-url" select="'schema.xsd'"/>
            
            <xsl:variable name="schema-doc" select="document($schema-url)"/>
            
            <xsl:key name="k1" match="xs:element[@name = 'content']//xs:enumeration/xs:annotation/xs:appinfo/codeName"
              use="ancestor::xs:enumeration/@value"/>
            
            <xsl:template match="tns:content">
              <!-- statt xsl:value-of select="."  dann -->
              <xsl:value-of select="$schema-doc//xs:element[@name = 'content']//xs:enumeration[@value = current()]/xs:annotation/xs:appinfo/codeName"/>
            </xsl:template>
            
            ...
            </xsl:stylesheet>

            Comment


            • #7
              Danke ich werde mich mal daran versuchen ...

              Comment

              Working...
              X