Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[PHP] XSL select wil niet matchen

Pagina: 1
Acties:

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 05-09 14:39

_Thanatos_

Ja, en kaal

Topicstarter
Ik begin weer eens met php, met iets heel simpels. Nouja, dat dacht je, want simpele dingen kunnen soms moeilijker zijn dan ze zich voordoen. Enfin, ik probeer met XSL een XML om te zetten naar HTML en naar de output te spugen. Simple as that.

Er is niets fancy aan de php-code, niets fancy aan de xml, niets fancy aan de xslt.

Een snippet uit m'n xml:
XML:
1
2
3
4
5
<imp xmlns="http://thany.nl/imp">
  <category id="length">
    <!-- ... -->
  </category>
</imp>


Een trimmed-down xslt die niet werkt:
code:
1
2
3
4
5
6
7
8
<?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" indent="yes" encoding="utf-8" standalone="no" omit-xml-declaration="yes"/>

  <xsl:template match="/imp">
    current = <xsl:value-of select="name(.)"/><br/>
  </xsl:template>
</xsl:stylesheet>

Hier matcht het hele template niet. Ook niet als ik em laat matchen op //imp of imp .
Waarom niet??

Als ik em laat matchen op /*[name()='imp'] dan werkt het als een kitten. Maar wtfbbq waarom is dit? Je kunt toch gewoon op een elementnaam matchen :? :?

Het lijkt een beetje plemp-je-code-neer-en-wacht-op-antwoord, maar ik sta hier gewoon perplex. Dit is zo fokking simpel en het is beslist niet voor het eerst dat ik dit doe (tenminste buiten php dan) en ik zie echt ECHT niet waarom dit zo ontzettend faalt... Voor de volledigheid, in m'n php gebruik het het poepsimpele dittem:
PHP:
1
2
3
4
5
6
7
$xp = new XsltProcessor();
$xsl = new DomDocument();
$xsl->load('units.xslt');
$xp->importStylesheet($xsl);
$xml_doc = new DomDocument();
$xml_doc->load('units.xml');
echo $xp->transformToXML($xml_doc);

Ik zei toch, niets bijzonders aan. Tenminste dat hoop ik. Want in php is dit m'n eerste keer, maar alle internetvoorbeelden lijken op wat ik hier heb. Zou toch goed moeten zijn :?

Wat doe ik in godsnaam dan nog fout?

日本!🎌


  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Googlewoord van de dag : namespaces.

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 05-09 14:39

_Thanatos_

Ja, en kaal

Topicstarter
Kun je wat specifieker zijn? Want ik gebruik geen namespaces, dus ik kan ze ook niet uit m'n duim gaan zuigen.

日本!🎌


  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
imp staat in een namespace.

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 05-09 14:39

_Thanatos_

Ja, en kaal

Topicstarter
Ja dus? Dat is een default namespace, dus dat moet in de xslt toch gewoon werken?

Als je een oplossing weet, zou je dan iets minder raadselachtig kunnen doen? Ik begrijp nml niet precies waar je nou naartoe wil met je antwoorden.

[ Voor 48% gewijzigd door _Thanatos_ op 19-02-2013 14:00 ]

日本!🎌


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 05-09 14:39

_Thanatos_

Ja, en kaal

Topicstarter
Okay, je MOET dus een prefix gebruiken (uit je duim zuigen).

Wat weird zeg. Ik heb dat echt nog nooit hoeven doen. Wat onhandig ook, met al die prefixen op *iedere* selectie in je xpaths, wordt het toch een wirwar? Het wordt in elk geval veel minder goed leesbaar, en ik wilde de boel juist eenvoudig en clean houden :-/

Hopelijk kan ik die "xpath-default-namespace" gebruiken, maar ook dat heb ik in het verleden nooit hoeven doen. Waarom moet dit nu opeens wel? Is er iets fundamenteel veranderd ofzo?

日本!🎌


  • Devil
  • Registratie: Oktober 2001
  • Niet online

Devil

King of morons

Gebruikte je in het verleden ook een namespace in je XML, want daar zit het 'probleem'. Haal die namespace eruit en alles werkt zonder prefixes op je xpath expressies.

After all, we are nothing more or less than what we choose to reveal.


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 05-09 14:39

_Thanatos_

Ja, en kaal

Topicstarter
Ik vrees dat dat te lang gleden is :X

Maar ik zou verwachten dat als er geen twijfel kan bestaan over welke xml je aan het selecteren bent, dat het niet uitmaakt welke namspace je gebruikt. En in mijn geval is ambiguiteit ook onmogelijk: er is maar één xml. Letterlijk, het is één statisch bestand.

Maar, maakt dat namespaces niet tot een clunky manier om twee xml's uit elkaar te houden? Ik vind dit nml niet bijster leesbaar:

/imp:root/imp:parent/imp:child/imp:grantchild

imp imp imp imp, er staat te vaak hetzelfde. Niet bepaald DRY-proof. Ik zou liever "mijn" namespace als default gebruiken, want elementen in de xpath prefixen, en in de source xml niet, smaakt gewoon zuur. Het ziet eruit alsof je iets anders probeert te selecteren. Dat maar es proberen dan. Ik zie werkelijk waar niet waarom een processor hier een probleem van moet maken.

/edit
Nou dat werkt dus niet. Een default namespace definieren helpt geen zak. Dat is dus een default namespace op het <xsl:stylesheet> element. Zodat die default namespace gaat slaan op (en hetzeflde is als) mijn source xml. Wat is een reden dat dat niet werkt?

[ Voor 13% gewijzigd door _Thanatos_ op 20-02-2013 21:49 ]

日本!🎌


  • pedorus
  • Registratie: Januari 2008
  • Niet online
Dat is XSLT 2, en dat wordt nog nauwelijks ondersteund.. In plaats van imp kun je beter i gebruiken als afkorting. Of je kunt namespaces weggooien. http://wiki.tei-c.org/index.php/Remove-Namespaces.xsl (Of een alternatieve library gebruiken met xslt 2 support)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten

Pagina: 1