Toon posts:

[xstl checken of een attribute bestaat en of leeg is

Pagina: 1
Acties:

Verwijderd

Topicstarter
stel ik maak gebruik van de volgende xml:

code:
1
2
3
4
5
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <data somedate="2006-16-07"/>
  <data somedate="1900-01-01"/>
</root>


voor het bovenstaande xml maak ik gebruik van het onderstaande xstl:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?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="/">
          <root>
             <xsl:for-each select="/root/data">
    <date>
        <xsl:if test="string(/root/data/@somedate)">
           <xsl:attribute name="date">
              <xsl:apply-templates select="@somedate"/>
           </xsl:attribute>
        </xsl:if>
    </date>
               </xsl:for-each>
              </root>
</xsl:template> 
</xsl:stylesheet>


zowel de xml als de xstl werkt prima totdat ik het volgende xml heb:
code:
1
2
3
4
5
<?xml version="1.0" encoding="UTF-8"?>
<root>
<data somedate=""/>
<data somedate="1900-01-01"/>
</root>


ik krijg dan het volgende resultaat:
code:
1
2
3
4
5
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <date/>
  <date/>
</root>


Kan iemand mij vertellen waarom dit zo is? ik kon helaas niks vinden op het internet om mijn probleem op te kunnen lossen. wat ik eigenlijk wil als resultaat is het volgende:

code:
1
2
3
4
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <date date="1900-01-01"/>
</root>


dus een date element met een somedate attribute die niet bestaat of die leeg is mag niet getoond worden.

Weet iemand misschien hoe ik dit kan oplossen?

  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

code:
1
<xsl:if test="string-length(/root/data/@somedate) &gt; 0">


www.zvon.org zou een goede site voor je kunnen zijn. :)

Sundown Circus


Verwijderd

Topicstarter
RedRose schreef op zondag 16 juli 2006 @ 22:30:
code:
1
<xsl:if test="string-length(/root/data/@somedate) &gt; 0">


www.zvon.org zou een goede site voor je kunnen zijn. :)
Bedankt voor de snelle reactie maar helaas lost dit het probleem nog niet op. Ik krijg nog steeds een "lege" xml terug.

  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

Verwijderd schreef op zondag 16 juli 2006 @ 22:35:
[...]


Bedankt voor de snelle reactie maar helaas lost dit het probleem nog niet op. Ik krijg nog steeds een "lege" xml terug.
Daarom moet je je denk ik even wat meer verdiepen in xslt. Het was meer bedoeld als opzetje..

Wat je wil is ongeveer:

code:
1
2
3
-voor elke data in /root/date
-als het somedate attribute niet leeg is:
    - maak een nieuw element, met een nieuwe attribute aan


Daarnaast gaat het toekennen van je attribuut aan date natuurlijk ook gewoon fout ;)

[ Voor 10% gewijzigd door RedRose op 16-07-2006 22:45 ]

Sundown Circus


  • rollebol
  • Registratie: Mei 2000
  • Laatst online: 22-08-2025
Ik heb hiervoor een template die ik aanroep:
code:
1
2
3
4
5
6
7
    <xsl:template match="@*|*" mode="NonEmptyAttribute">
        <xsl:param name="Name" select="name()"/>

        <xsl:if test="string-length(normalize-space(.))&gt;0">
            <xsl:attribute name="{$Name}"><xsl:value-of select="."/></xsl:attribute>
        </xsl:if>
    </xsl:template>

[ Voor 25% gewijzigd door rollebol op 16-07-2006 23:02 ]


Verwijderd

Topicstarter
RedRose schreef op zondag 16 juli 2006 @ 22:43:
[...]


Daarom moet je je denk ik even wat meer verdiepen in xslt. Het was meer bedoeld als opzetje..

Wat je wil is ongeveer:

code:
1
2
3
-voor elke data in /root/date
-als het somedate attribute niet leeg is:
    - maak een nieuw element, met een nieuwe attribute aan


Daarnaast gaat het toekennen van je attribuut aan date natuurlijk ook gewoon fout ;)
Kan jij mij misschien vertellen wat er dan fout gaat bij het toekennen van een attribute aan date? ik zal niet weten hoe anders?

en nog bedankt voor de bron. staat inderdaad veel info :)

  • rollebol
  • Registratie: Mei 2000
  • Laatst online: 22-08-2025
Verander regel 8 trouwens eens:
<xsl:if test="string(/root/data/@somedate)">
moet zijn:
<xsl:if test="string-length(@somedate) > 0">

De reden lijkt me evident. Als dat niet zo is, lees dan eens de xpath-spec.

Verwijderd

Topicstarter
rollebol schreef op zondag 16 juli 2006 @ 23:08:
Verander regel 8 trouwens eens:
<xsl:if test="string(/root/data/@somedate)">
moet zijn:
<xsl:if test="string-length(@somedate) > 0">

De reden lijkt me evident. Als dat niet zo is, lees dan eens de xpath-spec.
Bedankt het lost inderdaad mijn probleem op. kan niet geloven wat een verschil dat is. _/-\o_

Verwijderd

Gebruik je overigens MSXMLDOM? Bij MS zijn de DOM parser en SQL Server nogal nauw verweven, en "1900-01-01" is voor MSSQL de 0-datum. Ik kan me voorstellen dat XMLDOM dat dan interpreteert als geen datum...

(Bij InterBase is de 0-datum "1899-12-30", vraag me niet waarom, en andere databases zullen ook wel hun eigen 0-datum hebben)
Pagina: 1