Toon posts:

[XSLT] Probleem bij transformeren WordML

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik probeer een XSLT bestand te maken om WordML (MS Word XML formaat, zie http://rep.oio.dk/Microsoft.com/officeschemas/welcome.htm) om te zetten naar redelijk schone (X)HTML.

(Daarmee moet het, in combinatie met PHP, mogelijk zijn om een Word bestand inclusief de embedded afbeeldingen in html om te zetten)

Ik zit met een probleem mbt tot XSLT. Een fragment van een oude versie van mijn XSLT bestand:
XSLT:
1
2
3
4
5
6
7
8
9
10
11
12
13
<xsl:template match="w:r">
    <xsl:choose>
        <xsl:when test=".//w:i">
            <i><xsl:apply-templates /></i>
        </xsl:when>
        <xsl:when test=".//w:b">
            <b><xsl:apply-templates /></b>
        </xsl:when>
        <xsl:otherwise>
            <xsl:apply-templates />
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

Dit matcht een r element (een soort container). Het test of er zich in dit r element een i of b element bevindt (waarmee wordt aangegeven dat de inhoud van de r cursief of vet moet zijn.) Wanneer een i of b element gevonden wordt, wordt er een nette HTML tag neergezet. Dit werkt niet op het moment dat een tekst zowel vet als cursief is, alleen cursief wordt dan gematcht. Mijn aanpassing is als volgt:
XSLT:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<xsl:template match="w:r">
    <xsl:if test=".//w:i">
        <i>
    </xsl:if>

    <xsl:if test=".//w:b">
        <b>
    </xsl:if>
    
    <xsl:apply-templates />
        
    <xsl:if test=".//w:i">
        </i>
    </xsl:if>

    <xsl:if test=".//w:b">
        </b>
    </xsl:if>
</xsl:template>

Nu test'ie 2 keer voor elke stijl, 1 keer voor het plaatsen van de open tag, en 1 keer voor het plaatsen van de close tag. Principieel werkt dit, echter in de praktijk is het xslt bestand niet meer well formed en wordt hij dus ook niet geparsed. (dit omdat hij nu niet-gesloten tags bevat). Ik heb geprobeerd:
- < en > vervangen door < en >
- de tags in CDATA sections gestopt: <![CDATA[<i>]]>

Op dat moment komen de tags ook als letterlijke tekst in de html ipv als HTML codes.

Enig idee hoe ik toch die enkele tags kan gebruiken? Een andere oplossing voor mijn probleem (zijnde het kunnen nesten van <b> en <i> opmaaktags?)

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 20-02 03:31

Gerco

Professional Newbie

Ik was hier al bang voor toen ik de analyse van WordML op Groklaw las. Het lijkt wel een XML-Serialized memory dump te zijn ipv een zinnig XML document...

Ziet die WordML er zo ongeveer uit?
XML:
1
2
3
4
5
<w:r>
  <w:i/>
  <w:b/>
  <w:t>Wat bold + italic tekst</w:t>
</w:r>


Dan kun je misschien zoiets doen:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  <xsl:template match="w:r">
    <xsl:choose>
      <xsl:when test="../w:i">
        <i><xsl:apply-templates/></i>
      </xsl:when>
      <xsl:when test="../w:b">
        <b><xsl:apply-templates/></b>
      </xsl:when>
      <xsl:when test="../w:i and ../w:b">
        <i><b><xsl:apply-templates/></b></i>
      </xsl:when>
      <xsl:otherwise>
        <xsl:apply-templates/>
      </xsl:otherwise>
  </xsl:template>


Schaalt natuurlijk voor geen meter, maar het is voor deze situatie best bruikbaar.

[ Voor 55% gewijzigd door Gerco op 07-05-2006 21:41 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Verwijderd

Topicstarter
voorbeeldje van WordML:

XSLT:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<w:p>
    <w:r>
        <w:t>Plain</w:t>
    </w:r>
    <w:r>
        <w:rPr>
            <w:b/>
        </w:rPr>
        <w:t>Vet</w:t>
    </w:r>
    <w:r>
        <w:t> </w:t>
    </w:r>
    <w:r>
        <w:rPr>
            <w:i/>
        </w:rPr>
        <w:t>Italic</w:t>
    </w:r>
    <w:r>
        <w:rPr>
            <w:b/>
            <w:i/>
        </w:rPr>
        <w:t>Vet en italic</w:t>
    </w:r>
</w:p>

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 20-02 03:31

Gerco

Professional Newbie

Dan kun je zoiets doen toch?
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  <xsl:template match="w:r">
    <xsl:choose>
      <xsl:when test="w:rPr/w:i">
        <i><xsl:apply-templates select="w:t"/></i>
      </xsl:when>
      <xsl:when test="w:rPr/w:b">
        <b><xsl:apply-templates select="w:t"></b>
      </xsl:when>
      <xsl:when test="w:rPr/w:i and w:rPr/w:b">
        <i><b><xsl:apply-templates select="w:t"></b></i>
      </xsl:when>
      <xsl:otherwise>
        <xsl:apply-templates/>
      </xsl:otherwise>
  </xsl:template>

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Verwijderd

My 2 cents:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:w="http://bla.bla.org">
    <xsl:output method="html"/>

    <xsl:template match="/">
        <HTML>
            <xsl:apply-templates/>
        </HTML>
    </xsl:template>

    <xsl:template match="w:r">
        <xsl:choose>
            <xsl:when test="w:rPr/w:i">
                <xsl:choose>
                    <xsl:when test="w:rPr/w:b">
                        <b>
                            <i>
                                <xsl:apply-templates select="w:t"/>
                            </i>
                        </b>
                    </xsl:when>
                    <xsl:otherwise>
                        <i>
                            <xsl:apply-templates select="w:t"/>
                        </i>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:when>

            <xsl:when test="w:rPr/w:b">
                <b>
                    <xsl:apply-templates select="w:t"/>
                </b>
            </xsl:when>
            
            <xsl:otherwise>
                <xsl:apply-templates/>
            </xsl:otherwise>

        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>



probeert u deze eens ...

Verwijderd

Topicstarter
Op zich werkt bovenstaande methode in deze specifieke situatie. Ik zoek echter iets wat algemener werkt en iets schaalbaarder is. Deze methode heeft n*n aan beslissingsnodes nodig (n = aantal soorten opmaaktags, <b>, <i>, <u>, <h1> etc.) Op een gegeven moment is dat natuurlijk niet meer te overzien.

Ik ben echter bezig met een mooiere manier om de tags te kunnen nesten, is veelbelovend. Zodra ik iets werkend heb zal ik het posten, zo heeft iemand anders er mischien ook nog wat aan.
Pagina: 1