Announcement

Collapse
No announcement yet.

Xslt

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

  • Xslt

    Hallo,

    ich hänge seit geraumer Zeit an ein und demselben Problem: ich möchte mit XSLT eine XML-Datei verbessern - den Namensraum habe ich auch schon alles. Mein Problem ist diese Stelle:

    XML-Datei

    [...]
    Code:
    <titleStmt>
                                
                                <title>An Ludwig Ysenburg von Buri</title>
    </titleStmt>
    [...]

    Mithilfe von XSLT möchte ich, dass sie so aussieht:

    [...]
    Code:
    <titleStmt>
                                
                                <title>An <name>Ludwig Ysenburg von Buri</name></title>
    </titleStmt>
    [...]

    In meiner Datei gibt es mehrere Anreden, und ich möchte um die Namen ein Tag mit <name> herum haben. Meine Templates sehen wie folgt aus:
    Code:
        <!-- Identity transformation mit copy-->
        <xsl:template match="@*|node()">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
        </xsl:template> 
    
    
    <xsl:template match="//titleStmt/title">
            <name>
            <xsl:apply-templates select="substring-after(current(),'An')"/>
            </name>
        </xsl:template>
    Aber es funktioniert nicht. Ich weiß, irgendwo ist ein Fehler, aber nachdem ich mir nun gefühlte 100 Sachen durchgelesen hab bin ich noch verwirrter als vorher und denke der Fehler könnte überall im template sein. Ich bin noch ein Anfänger und beiße mich gerade durch das Thema durch... Kann mir eventuell jemand helfen?

    Viele liebe Grüße,
    Missmauz
    Zuletzt editiert von Missmauz; 14.01.2012, 20:05.

  • #2
    Code:
    <xsl:template match="titleStmt/title[starts-with(., 'An ')]">
      <xsl:copy>
          <xsl:text>An </xsl:text>
          <name>
              <xsl:value-of select="substring(., 4)"/>
          </name>
      </xsl:copy>
    </xsl:template>

    Comment


    • #3
      Dankeschön! Ich habe den Code gleich eingefügt und ein anderes template mit dieser Vorlage erstellt, aber irgendwie will Oxygen mir meine Datei nicht transformieren... er macht bloß die Identitätstransformation und mehr nicht... habe auch schon tei: vor den Elementnamen in xslt gesetzt, weil ich mir nicht sicher war, ob es eventuell daran liegen könnte - aber daran lag es wohl nicht...

      falls es hilft, hier ist der Anfang meiner Datei:

      Code:
      <?xml version="1.0" encoding="UTF-8"?>
      <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
          xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs"
          xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl" version="1.0"
          xmlns:tei="http://www.tei-c.org/ns/1.0">
      <xsl:output method="xml"/>
      Zuletzt editiert von Missmauz; 14.01.2012, 20:57.

      Comment


      • #4
        Du wirst uns genaue Details über das XML-Eingabeformat mitteilen müssen, so da Namensräume verwendet werden, müssen wir deren Deklarationen sehen, auf jeden Fall die, die die Elemente betreffen, die du transformieren willst.
        Bisher hast du nur Eingabeelemente in keinem Namensraum gezeigt, und damit wird mein Beispiel funktionieren, wenn das Eingabedokument
        Code:
        <titleStmt>
          <title>An Ludwig Ysenburg von Buri</title>
        </titleStmt>
        ist, dann macht Saxon 6.5.5 mit dem Stylesheet
        Code:
        <xsl:stylesheet
          xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
          version="1.0">
          
        <xsl:template match="@* | node()">
          <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
          </xsl:copy>
        </xsl:template>
        
        <xsl:template match="titleStmt/title[starts-with(., 'An ')]">
          <xsl:copy>
              <xsl:text>An </xsl:text>
              <name>
                  <xsl:value-of select="substring(., 4)"/>
              </name>
          </xsl:copy>
        </xsl:template>
        
        </xsl:stylesheet>
        daraus
        Code:
        <titleStmt>
          <title>An <name>Ludwig Ysenburg von Buri</name></title>
        </titleStmt>
        So die Elemente in einem Namensraum sind, also etwa das Eingabedokument
        Code:
        <titleStmt xmlns="http://www.tei-c.org/ns/1.0">
          <title>An Ludwig Ysenburg von Buri</title>
        </titleStmt>
        ist, dann muss man das Stylesheet anpassen:
        Code:
        <xsl:stylesheet
          xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
          xmlns="http://www.tei-c.org/ns/1.0"
          xmlns:tei="http://www.tei-c.org/ns/1.0"
          exclude-result-prefixes="tei"
          version="1.0">
          
        <xsl:template match="@* | node()">
          <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
          </xsl:copy>
        </xsl:template>
        
        <xsl:template match="titleStmt/title[starts-with(., 'An ')]">
          <xsl:copy>
              <xsl:text>An </xsl:text>
              <name>
                  <xsl:value-of select="substring(., 4)"/>
              </name>
          </xsl:copy>
        </xsl:template>
        
        </xsl:stylesheet>
        dann ist das Resultat
        Code:
        <titleStmt xmlns="http://www.tei-c.org/ns/1.0">
          <title>An Ludwig Ysenburg von Buri</title>
        </titleStmt>

        Comment


        • #5
          Okay, also ich habe verstanden, dass das mit dem Namensraum zu tun hat und ich habe selbigen auch im XML Dokument gefunden:

          Code:
          <?xml version="1.0" encoding="UTF-8"?>
          <teiCorpus xmlns="http://www.tei-c.org/ns/1.0"
                     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                     xmlns:tei="http://www.tei-c.org/ns/1.0"                       <!-- hier ist er -->
                     xmlns:xi="http://www.w3.org/2001/XInclude"
                     xmlns:tns="http://textgrid.info/namespaces/metadata/core/2010">
             <teiHeader xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
                        xmlns:tgl="http://textgrid.info/namespaces/metadata/language/2010"
                        xmlns:tgs="http://textgrid.info/namespaces/metadata/script/2010"
                        xmlns:tgr="http://textgrid.info/namespaces/metadata/agent/2010">
          Aber ich verstehe nicht, inwiefern und warum dieser Namensraum so funktioniert... Kann ich den dann einfach wegmachen und dann funktioniert es? Und welche Auswirkungen hat das dann auf das XML-Dokument? Entschuldige, jetzt habe ich eine Lösung und es tauchen noch mehr Fragen auf...

          Comment


          • #6
            Ich habe eben noch etwas herumprobiert und das zweite gleichnamige Namespace gefunden, welches gleich das erste Namespace in meiner XMl-Datei war. Habe jetzt beide namespaces herausgenommen und siehe da, es funktioniert. Jetzt steht allerdings da in meiner Ergebnisdatei:

            An <name xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl">Ludwig Ysenburg von Buri</name>

            Was hat diese Namespace für eine Bedeutung? muss ich die auch oben in meiner XML und in meiner XSLT-Datei mit aufnehmen?

            Sonnige Grüße

            Comment


            • #7
              Du solltest dich erst mit den Grundlagen von XML vertraut machen: http://de.wikipedia.org/wiki/XML-Namensraum, http://www.dpawson.co.uk/xsl/sect2/N5536.html.
              Und mit XPath und XSLT kann man durchaus XML mit Namensräumen verarbeiten, die Entfernung von Namensräumen, um ein Stylesheet funktionsfähig zu machen, mag als Experiment sinnvoll sein, aber ist sicher nicht die richtige Strategie, um existierende Dokumente zu verarbeiten.

              Comment


              • #8
                Der zweite Link ist echt super - Dankeschön! Und vielen Dank auch für alles Andere. Ich hoffe, ich kann das bald auch alles selbst... Wirklich vielen vielen Dank!

                Comment

                Working...
                X