[XML/XSL]CDATA in xsl:value-of select

Pagina: 1
Acties:

  • Danfoss
  • Registratie: Mei 2000
  • Laatst online: 15:14

Danfoss

Deze ruimte is te koop..

Topicstarter
Ik heb een stuk XML (export uit programma die ik niet kan wijzigen) die ik in een database wil stoppen (of html rapport van maken).
Nu ben ik er na flink zoekwerk achtergekomen dat ik daarvoor het beste met XSL een textbestand of html-pagina kan maken.

Nu ben ik een beetje aan het testen en ik kom er niet uit. In de XML staat een stuk tekst met CDATA eromheen:
XML:
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
<?xml version="1.0" encoding="ISO8859-1" ?>
<?xml-stylesheet type="text/xsl" href="temp1.xsl"?>
<REPORT>
<column>
  <qColId>A7C200</qColId> 
  <name>Product No.</name> 
  <controlType>0</controlType> 
  <isAggregate>0</isAggregate> 
  <assocType>0</assocType> 
  <breakLevel>0</breakLevel> 
  <sort>
     <type>none</type> 
     <level>0</level> 
  </sort>
  <xtabName /> 
  <xtabBreakLevel>0</xtabBreakLevel> 
  <expression>
     <name>Product No.</name> 
     <type>column</type> 
     <dataType>numeric</dataType> 
     <![CDATA[ ColumnRef["OUTDOORS"."PRODUCT"."PROD_NO"] ]]> 
  </expression>
  </column>
ETC...
</REPORT>


Ik gebruik deze XLS:
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
<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
  <html>
  <body>
    <table border="2" bgcolor="yellow">
      <tr>
        <th>Naam</th>
        <th>Type</th>
        <th>DateType</th>
        <th>Query</th>
      </tr>
      <xsl:for-each select="REPORT/column">
      <tr>
        <td><xsl:value-of select="expression/name"/></td>
        <td><xsl:value-of select="expression/type"/></td>
        <td><xsl:value-of select="expression/dataType"/></td>
        <td><xsl:value-of select="expression"/></td>
      </tr>
      </xsl:for-each>
    </table>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>


Nu wil ik alles binnen in de CDATA in 1 kolom stoppen. Ik krijg het niet voor elkaar om ALLEEN het CDATA deel uit de tak <expression> te halen. Als ik het doe zoals de xsl er nu uit ziet, krijg ik ook de andere waarden erbij.

Het zou er zo uit moeten komen:
NaamTypeDateTypeQuery
Product No.columnnumericColumnRef["OUTDOORS"."PRODUCT"."PROD_NO"]

Wat doe ik verkeerd en kan dit eigenlijk wel zo?

Sys Specs


  • JohanDM
  • Registratie: Augustus 2002
  • Laatst online: 16-07-2021

JohanDM

Optimist

Het is mogelijk om aan het CDATA gedeelte te geraken, door het op positie te referencen:
code:
1
<xsl:value-of select="expression/node()[3]"/>

Op deze mannier neem je de 4e node uit "expression".
In je voorbeeld zijn node 0 tem 2 respectievelijk "name", "type" en "datatype" en is node 3 de text die er achter volgt, omdat tekst ook in een node wordt geplaatst door de XMLDOM.
Het probleem met deze aanpak is dat je afhankelijk bent van de vaste layout, er moeten altijd 3 tags voor staan die een eigen node krijgen, zodat het CDATA stuk in node 3 komt.
Een betere aanpak is het CDATA stuk tussen zijn eigen tags te steken bv "query" dan kan je een robuustere reference maken:
code:
1
<xsl:value-of select="expression/query"/>

"Two things are infinite: the universe and stupidity. And the former I'm not so sure about." -- Albert Einstein


  • Danfoss
  • Registratie: Mei 2000
  • Laatst online: 15:14

Danfoss

Deze ruimte is te koop..

Topicstarter
Thnx. Hier heb ik wat aan!

De layout is altijd vast, dus ik kan gewoon de node selecteren.

Sys Specs