Announcement

Collapse
No announcement yet.

HTML-Knoten in Textknoten verarbeiten

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

  • HTML-Knoten in Textknoten verarbeiten

    Hi Leute,
    folgendes Problem:
    Ich muss eine XML-Datei in eine WordML-Datei (Office 2007) umwandeln. Soweit so gut. Die grobe Transformation habe ich. Jetzt ist es aber so, dass es in der XML-Datei Textknoten gibt die HTML-Tags enthalten und die will ich weiterverarbeiten.
    Bsp:
    <rootknoten>
    ...
    ...
    <beschreibung>Die <b>Beschreibung</b> ist schon toll. </beschreibung>
    ....
    </rootknoten>

    Kann ich für die HTML-Tags irgendwie nochmal Templates schreiben? Bzw. ich will letztendlich dass die HTML-Tags durch äquivalente in WordML ersetzt werden. Sprich in Word würde stehen: Die Beschreibung ist schon toll.

    Hat jemand vlt Lösungsansätze oder Ideen? Danke.

    Gruß,
    henryf

  • #2
    Hier greift die übliche Template-Aufrufstrategie mit mehreren Templates und xsl:apply-templates. Für docx-Ausgaben könnte das ansatzweise so aussehen:
    Code:
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
      <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    
      <xsl:template match="rootknoten">
        <xsl:apply-templates/>  
      </xsl:template>
      
      <xsl:template match="beschreibung">
        <w:p>
          <xsl:apply-templates/>
        </w:p>  
      </xsl:template>
      
      <xsl:template match="text()">
        <w:r>
          <w:t><xsl:value-of select="."/></w:t>
        </w:r>
      </xsl:template>
      
      <xsl:template match="b">
        <w:r>
          <w:rPr>
            <w:b></w:b>  
          </w:rPr>
          <w:t><xsl:value-of select="text()"/></w:t>
        </w:r>
      </xsl:template>
       
    </xsl:stylesheet>

    Comment


    • #3
      Originally posted by Thomas Meinike View Post
      Hier greift die übliche Template-Aufrufstrategie mit mehreren Templates und xsl:apply-templates. Für docx-Ausgaben könnte das ansatzweise so aussehen:
      Code:
      <?xml version="1.0" encoding="ISO-8859-1"?>
      <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
        <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
      
        <xsl:template match="rootknoten">
          <xsl:apply-templates/>  
        </xsl:template>
        
        <xsl:template match="beschreibung">
          <w:p>
            <xsl:apply-templates/>
          </w:p>  
        </xsl:template>
        
        <xsl:template match="text()">
          <w:r>
            <w:t><xsl:value-of select="."/></w:t>
          </w:r>
        </xsl:template>
        
        <xsl:template match="b">
          <w:r>
            <w:rPr>
              <w:b></w:b>  
            </w:rPr>
            <w:t><xsl:value-of select="text()"/></w:t>
          </w:r>
        </xsl:template>
         
      </xsl:stylesheet>
      Hey vielen Dank! Das klappt. Eine Frage hätte ich dazu noch: Jetzt habe ich anstatt <b> &lt;b&gt; stehen. Sprich die HTML-Kodierung für < und >. *g* ja ich weiß die XML-Daten sind ziemlich grausam aber daran lässt sich leider nichts ändern.

      Mir ist schon klar, dass das wohl mit einer Transformation nicht funktionieren wird sowohl die Zeichen zu ersetzen als auch die Templates für die HTML-Tags zu verarbeiten über die Templates. Oder doch?

      Aber wenn ich das mit 2 Stylesheets mache. Welche Ersetzungsfunktion sollte ich nehmen. Die Funktion sollte aber keine XPATH 2.0 - Funktion sein, da der Word-XSLT-Prozessor kein XPATH 2.0 kann. Thank you!

      Comment


      • #4
        Diese Transformation wandelt die Entity-Referenzen wieder in spitze Klammern um und kopiert den Rest mittels Identity-Template:
        Code:
        <?xml version="1.0" encoding="UTF-8"?>
        <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        
          <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
        
          <xsl:template match="@* | node()">
            <xsl:copy>
              <xsl:apply-templates select="@* | node()"/>
            </xsl:copy>
          </xsl:template>
        
          <xsl:template match="text()[contains(.,'&lt;') or contains(.,'&gt;')]">
            <xsl:value-of select="." disable-output-escaping="yes"/>
          </xsl:template>
        
        </xsl:stylesheet>
        Aus
        Code:
        <?xml version="1.0" encoding="UTF-8"?>
        <rootknoten>
          <beschreibung>Die &lt;b&gt;Beschreibung&lt;/b&gt; ist schon toll.</beschreibung>
        </rootknoten>
        wird
        Code:
        <?xml version="1.0" encoding="UTF-8"?>
        <rootknoten>
          <beschreibung>Die <b>Beschreibung</b> ist schon toll.</beschreibung>
        </rootknoten>

        Comment

        Working...
        X