[XML - XSLT]alleen specifieke namespace laten zien

Pagina: 1
Acties:

  • kippetje01
  • Registratie: November 2001
  • Laatst online: 29-09-2025
He mensen,

Ik probeer een word xml file, waarin ik zelf via een schema weer xml heb ondergebracht, te ontleden.
ik probeer via een xslt het word document terug te brengen tot de custom tags die ik er zelf in heb gezet. Het probleem is dat de nesting erg lomp en vaag is met allerlei namespaces.

Ik wil dus eigenlijk middels een xslt alles van de namspace ns0 laten zien, maar de rest niet.
Ik loop steeds vast op de w: namespace, deze kan ik niet verbergen want dan mis ik ook de ns0 namespace.

Is het uberhaupt mogelijk om dit met xslt te doen of zal ik toch echt via dom/ado aan de gang moeten?

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
43
44
45
46
47
48
49
50
<w:body>
~tags geknipt~
<ns0:Employee>
  <w:p>
    <w:pPr>
      <w:rPr>
        <w:lang w:val="EN-GB" /> 
      </w:rPr>
    </w:pPr>
-   <w:r>
-     <w:rPr>
        <w:lang w:val="EN-GB" /> 
      </w:rPr>
      <w:t>Employee:</w:t> 
    </w:r>
  </w:p>
  <ns0:Name>
    <w:p>
-     <w:pPr>
-       <w:tabs>
          <w:tab w:val="left" w:pos="3420" /> 
          <w:tab w:val="left" w:pos="6300" /> 
        </w:tabs>
-     <w:rPr>
        <w:lang w:val="EN-GB" /> 
      </w:rPr>
    </w:pPr>
-   <w:r>
-     <w:rPr>
        <w:lang w:val="EN-GB" /> 
      </w:rPr>
      <w:t>First name:</w:t> 
    </w:r>
-   <ns0:First>
-     <w:r>
-       <w:rPr>
          <w:lang w:val="EN-GB" /> 
        </w:rPr>
        <w:t>Florens</w:t> 
      </w:r>
    </ns0:First>
~alle niet belangrijke tags vanaf hier weg gehaald~
    <ns0:Middle ></ns0:Middle>
-   <ns0:Last>
      <w:t>Koning</w:t> 
    </ns0:Name>
~tags geknipt~
</ns0:Employee>
~tags geknipt~
</w:body>


p.s. als je een volledig word doc xml bestand wil zien dan raad ik je aan er zelf even een te maken :P

-edit- Grmbl nog geen goeie titel geformuleerd... als het mogelijk is graag: [XML - XSLT] alleen specifieke namespace laten zien

[ Voor 20% gewijzigd door kippetje01 op 27-04-2006 14:43 ]


Verwijderd

Hmm, dit doet wat je vraagt, hopelijk is dat ook wat je bedoelt :)


XSLT:
1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml"/>

    <xsl:template match="ns0:*" xmlns:ns0="http://www.somecompany.com/ennesnul">
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09-2025

djc

Verwijderd schreef op donderdag 27 april 2006 @ 15:24:
Hmm, dit doet wat je vraagt, hopelijk is dat ook wat je bedoelt :)[/code]
Dat was wel het idee dat ik ook begrepen had. :)

Rustacean


  • kippetje01
  • Registratie: November 2001
  • Laatst online: 29-09-2025
hmm, tot dusverre werkt het alleen niet,

ik krijg namelijk nog een text tags van andere geneste <w:tags> mee
iets als <w:asdf>blablablabla</w:asdf>

dat is eigenlijk het probleem wat ik al de hele tijd had :/
het vreemde is dat wel de tags die er omheen stonden weg zijn, maar de inhoud blijft dus bestaan en dat is vrij lastig.

[ Voor 27% gewijzigd door kippetje01 op 28-04-2006 11:25 ]


Verwijderd

Kun je aub een klein, maar wel "compleet" voorbeeldje geven van je input?
Dus met de namespace definities enzo.
Dan kan ik wat beter testen.

  • kippetje01
  • Registratie: November 2001
  • Laatst online: 29-09-2025
hehe, dat "klein" en "compleet" is wat lastig, maar ik ga het proberen :P

Even een voorbeeld inelkaar gezet dat zich hetzelfde gedraagd:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="xslt.xsl"?>
<w:aap xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" xmlns:ns0="urn:employees" xmlns:o="urn:schemas-microsoft-com:office:office">
    <w:naar><w:t>asdfasf</w:t></w:naar>
    <ns0:Employee id="123">
        <ns0:first><w:t>jan</w:t></ns0:first>
        <ns0:middle><w:t>de</w:t></ns0:middle>
        <ns0:last><w:t>vries</w:t></ns0:last>
        <w:naar2><w:t>12341234</w:t></w:naar2>
    </ns0:Employee>
    <ns0:Employee id="1234">
        <ns0:first><w:t>klaas</w:t></ns0:first>
        <ns0:middle><w:t>-</w:t></ns0:middle>
        <ns0:last><w:t>janssen</w:t></ns0:last>
    </ns0:Employee>
    <ns0:Employee id="12345">
        <ns0:first><w:t>piet</w:t></ns0:first>
        <ns0:middle><w:t>van</w:t></ns0:middle>
        <ns0:last><w:t>jeuk</w:t></ns0:last>
    </ns0:Employee>
</w:aap>

[ Voor 217% gewijzigd door kippetje01 op 04-05-2006 10:23 ]


  • djc
  • Registratie: December 2001
  • Laatst online: 08-09-2025

djc

kippetje01 schreef op vrijdag 28 april 2006 @ 11:23:
ik krijg namelijk nog een text tags van andere geneste <w:tags> mee
iets als <w:asdf>blablablabla</w:asdf>
Dat klopt wel, want die copy-of pakt de hele subtree mee, onafhankelijk van wat daarin zit. Eigenlijk moet je dus de current node dupliceren met alle bijbehorende attributen en daarna gewoon weer een apply-templates select="*" doen op alle kinders. Ik kan alleen even niet bedenken hoe je al die attributen meekrijgt.

Rustacean


  • djc
  • Registratie: December 2001
  • Laatst online: 08-09-2025

djc

kippetje01 schreef op vrijdag 28 april 2006 @ 13:05:
Even een voorbeel inelkaar gezet dat zich hetzelfde gedraagd:
[/code]
Volgens mij heb je hier geen voorbeeld van zo'n geneste w:tag, toch? Zou nuttig zijn om toe te voegen.

Rustacean


  • kippetje01
  • Registratie: November 2001
  • Laatst online: 29-09-2025
Manuzhai schreef op vrijdag 28 april 2006 @ 13:23:
[...]
Volgens mij heb je hier geen voorbeeld van zo'n geneste w:tag, toch? Zou nuttig zijn om toe te voegen.
klopt, maar die text die in de <w:naar> tag staat krijg je dus wel te zien...
ik heb ook even een geneste w:tag toegevoegd, dit maakt weinig uit verder maar toch.

Verwijderd

Oh, ik begrijp het (denk ik) nu een beetje beter.
Die strings als "asdfasf" en "12341234" wil je niet?

Oplossing daarvoor: voeg een extra template toe voor de text nodes, aldus:

<xsl:template match="text()"/>

en voila.

  • kippetje01
  • Registratie: November 2001
  • Laatst online: 29-09-2025
Verwijderd schreef op vrijdag 28 april 2006 @ 13:36:
Oh, ik begrijp het (denk ik) nu een beetje beter.
Die strings als "asdfasf" en "12341234" wil je niet?

Oplossing daarvoor: voeg een extra template toe voor de text nodes, aldus:

<xsl:template match="text()"/>

en voila.
hmm, nee dat werkt niet.
dan raak ik de text kwijt die ik wel wil bewaren :(

hoelanger ik er naar kijk des te meer ik het gevoel krijg dat dit niet kan, ergens ook wel logisch trouwens aangezien ik het ene element in een w:tag wel wil laten zien en het andere niet.

denk dat ik er maar een programmeer slag overheen moet laten gaan om een acceptabel eindresultaat te krijgen.

[ Voor 91% gewijzigd door kippetje01 op 28-04-2006 15:51 ]


Verwijderd

Kun je aub een voorbeeldje geven wat je als output wilt hebben, gebaseerd op het input voorbeeld dat je hiervoor gaf?

  • kippetje01
  • Registratie: November 2001
  • Laatst online: 29-09-2025
Dit is de output die ik graag zou zien, evt zonder de namespaces maar dat zal me roesten.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0"?>
<document xmlns:ns0="urn:employees" >

    <ns0:Employee id="123">
        <ns0:first>jan</ns0:first>
        <ns0:middle>de</ns0:middle>
        <ns0:last>vries</ns0:last>

    </ns0:Employee>
    <ns0:Employee id="1234">
        <ns0:first>klaas</ns0:first>
        <ns0:middle>-</ns0:middle>
        <ns0:last>janssen</ns0:last>
    </ns0:Employee>
    <ns0:Employee id="12345">
        <ns0:first>piet</ns0:first>
        <ns0:middle>van</ns0:middle>
        <ns0:last>jeuk</ns0:last>
    </ns0:Employee>
</document>

[ Voor 81% gewijzigd door kippetje01 op 03-05-2006 10:53 ]


Verwijderd

Hmm, misschien is dit wat:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="ns0:*" xmlns:ns0="urn:employees">
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="w:*/text()" xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml"/>

</xsl:stylesheet>

  • kippetje01
  • Registratie: November 2001
  • Laatst online: 29-09-2025
Ik ben bang van niet :/

helaas.

Verwijderd

Okee,

het volgende input document:

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0"?>
<w:aap xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" 
       xmlns:ns0="urn:employees" 
       xmlns:o="urn:schemas-microsoft-com:office:office">
    <w:naar>asdfasf</w:naar>
    <ns0:Employee id="123">
        <ns0:first>jan</ns0:first>
        <ns0:middle>de</ns0:middle>
        <ns0:last>vries</ns0:last>
    </ns0:Employee>
    <w:naar2>12341234</w:naar2>
    <ns0:Employee id="1234">
        <ns0:first>klaas</ns0:first>
        <ns0:middle>-</ns0:middle>
        <ns0:last>janssen</ns0:last>
    </ns0:Employee>
    <ns0:Employee id="12345">
        <ns0:first>piet</ns0:first>
        <ns0:middle>van</ns0:middle>
        <ns0:last>jeuk</ns0:last>
    </ns0:Employee>
</w:aap> 



Geeft met de volgende Style Sheet:

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                                xmlns:ns0="urn:employees">
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/">
        <xsl:element name="ns0:DocuMent">
            <xsl:apply-templates/>
                                </xsl:element>
    </xsl:template>

    <xsl:template match="ns0:*" xmlns:ns0="urn:employees">
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="w:*/text()" xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml"/>
</xsl:stylesheet>


de volgende output:

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0"?>
<ns0:DocuMent xmlns:ns0="urn:employees">
    <ns0:Employee id="123">
        <ns0:first>jan</ns0:first>
        <ns0:middle>de</ns0:middle>
        <ns0:last>vries</ns0:last>
    </ns0:Employee>
    <ns0:Employee id="1234">
        <ns0:first>klaas</ns0:first>
        <ns0:middle>-</ns0:middle>
        <ns0:last>janssen</ns0:last>
    </ns0:Employee>
    <ns0:Employee id="12345">
        <ns0:first>piet</ns0:first>
        <ns0:middle>van</ns0:middle>
        <ns0:last>jeuk</ns0:last>
    </ns0:Employee>
</ns0:DocuMent>



Kun je aub uitleggen wat hieraan "verkeerd" is?

  • kippetje01
  • Registratie: November 2001
  • Laatst online: 29-09-2025
dat ziet er uit als de juiste output, maar de stylesheet die je gebruikt is anders dan die van je vorige post.

Ik zal eens kijken of ik het met die stylesheet ook aan de praat krijg.

ahhhhhh ik zie het probleem al lol.
Je input document mist de <w:t></w:t> tags die de stukken text omvatten.
het juiste input document staat een stukje omhoog.
die <w:t> tags vernachelen de boel dan ook flink volgens mij.

[ Voor 42% gewijzigd door kippetje01 op 04-05-2006 10:25 ]


  • djc
  • Registratie: December 2001
  • Laatst online: 08-09-2025

djc

Verwijderd schreef op donderdag 04 mei 2006 @ 09:52:
Geeft met de volgende Style Sheet:
Nice, die @*! Ik zat te denken dat daar een specifiek construct voor moest zijn, maar de attributen zijn natuurlijk ook gewoon nodes.

Rustacean


  • djc
  • Registratie: December 2001
  • Laatst online: 08-09-2025

djc

kippetje01 schreef op donderdag 04 mei 2006 @ 10:18:
ahhhhhh ik zie het probleem al lol.
Je input document mist de <w:t></w:t> tags die de stukken text omvatten.
het juiste input document staat een stukje omhoog.
die <w:t> tags vernachelen de boel dan ook flink volgens mij.
Maar werkt de stylesheet nog niet? Die zou de w:t tags er zo uit moeten gooien, en dat is toch de bedoeling?

Rustacean


  • kippetje01
  • Registratie: November 2001
  • Laatst online: 29-09-2025
klopt, maar de text staat dus in die w:t tags en gaat dus ook verloren. je houdt dan de lege ns0:* tags over.
al gekeken of ik dat met een of andere not constructie kon oplossen maar dat gaat natuurlijk niet lukken omdat ik geen goede criteria kan formuleren.

uiteraard zou ik ieder losse element kunnen behandelen maar dat is nou precies niet de bedoeling natuurlijk ;)

[ Voor 55% gewijzigd door kippetje01 op 05-05-2006 14:54 ]


Verwijderd

ehhh, begrijp ik het nu goed dat je bijvoorbeeld het volgende wilt:

<ns0:last>
<w:t>vries</w:t>
</ns0:last> moet wel verschijnen in de output

<w:naar2>
<w:t>12341234</w:t>
</w:naar2> moet niet verschijnen in de output

Als ik je bedoeling goed begrepen heb, dan zitten de zowel de nodes die je niet wilt hebben als de nodes die je wel wilt hebben, in dezelfde namespace (w), dus met een StyleSheet die alleen de ns0 nodes kopieert is dit niet op te lossen.

Ik zie effe niet wat nou het principiele verschil is tussen de twee w:t elementen ...
Ze zitten allebei "onder" ns0:Employee.

Is het misschien een oplossing als we templates maken voor alleen maar Employee-first tm last?
En de rest van de nodes gewoon niet overkopieeren? Of is dit te simpel gedacht?

  • kippetje01
  • Registratie: November 2001
  • Laatst online: 29-09-2025
Verwijderd schreef op vrijdag 05 mei 2006 @ 15:55:
ehhh, begrijp ik het nu goed dat je bijvoorbeeld het volgende wilt:

<ns0:last>
<w:t>vries</w:t>
</ns0:last> moet wel verschijnen in de output

<w:naar2>
<w:t>12341234</w:t>
</w:naar2> moet niet verschijnen in de output

Als ik je bedoeling goed begrepen heb, dan zitten de zowel de nodes die je niet wilt hebben als de nodes die je wel wilt hebben, in dezelfde namespace (w), dus met een StyleSheet die alleen de ns0 nodes kopieert is dit niet op te lossen.

Ik zie effe niet wat nou het principiele verschil is tussen de twee w:t elementen ...
Ze zitten allebei "onder" ns0:Employee.
Yep, dat was inderdaad een beetje het idee. Het kan dus niet, jammer.
Is het misschien een oplossing als we templates maken voor alleen maar Employee-first tm last?
En de rest van de nodes gewoon niet overkopieeren? Of is dit te simpel gedacht?
Tja, dat zou nog kunnen, maar dat maakt het niet echt uitbreidbaarder helaas.
Bedankt voor de moeite in iedergeval, ik ga het maar gewoon intern met een dom tree ofzo oplossen.
Pagina: 1