/ / Zistiť, či súbor XML obsahuje určitý priestor názvov - xslt, xslt-1.0

Zistite, či súbor XML obsahuje určitý názov - xslt, xslt-1.0

Opäť jednoduchá vec. Mám štýl, ktorý analyzuje súbory XML a XSL. V podstate sa pokúša zistiť, či je XML štýl s:

<xsl:if test="count(//xsl:template)!=0">

Naozaj rozpozná štýly. Má však problémy s XML súbormi, ktoré generujú "Nedefinovaná predpona priestoru názvov - "xsl""(v XmlSpy Podobné chyby v projekte, na ktorom pracujem.)

Robím niečo zlé. Akékoľvek návrhy na zlepšenie tohto štýlu?


Niektoré ďalšie informácie: Jedná sa o šablónu so štýlmi, ktorá má analyzovať iné súbory XML, bez ohľadu na to, čo obsahujú, mala by byť schopná sa dokonca pretvárať a urobí tak pekne, nemá žiadny problém transformovať ďalšie (normálne) štýly. Snažím sa premeniť bežný súbor XML, ale nie všetky súbory XML ...


Ako sa ukazuje, chyba je niečo iné. Súbory XML, ktoré som sa pokúsila transformovať, obsahujú inštrukcie na spracovanie. Toto: <?xml-stylesheet href="..MyStylesheet.xsl" type="text/xsl"?>
Problém, ktorý mám teraz, je, že keď spracujem jedenSúbor XML, ktorý obsahuje tento PI, XSLT začne hlásiť chybu o nedefinovanom predpise priestoru názvov. Ako teda môžem povedať, že procesor XSLT ignoruje túto inštrukčnú príručku?

odpovede:

1 pre odpoveď č. 1

Dvojitá kontrola, ako ste vyhlásili xsl názov priestoru a aký premenný priestor premennej ste si vybrali.

Musíte sa uistiť, že xsl Predpona menného priestoru je definovaná v šablóne so štýlmi, ak ju chcete použiť vo vašich výrazoch XPATH. Táto chyba sa zobrazí, keď sa pokúsite použiť predponu názvov priestoru, ktorý nebol deklarovaný.

Ak to nie je deklarované ďalej v štýle šablón (zvyčajne na prvku dokumentu, ako je tento: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">), alebo ak ste zvolili inú predvoľbu priestoru názvov (napr. deklarovaná ako "xslt" ako toto: xmlns:xslt="http://www.w3.org/1999/XSL/Transform"), potom keď sa pokúsite odkazovať na "xsl"nevie, čo hovoríte.

Môžete deklarovať xsl prefix názvov na vašom if vyhlásenie ako rýchly test:

<xsl:if test="count(//xsl:template)!=0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

Akékoľvek návrhy na zlepšenie tohto stavu štýlov?

Môžete zjednodušiť testovacie podmienky a vybrať xsl:template skôr ako hodnotenie count() z nich. Výsledky test="//xsl:template" bude vyhodnocovať ako true() ak je vybratá niečo a false() ak nie je vybratá žiadna položka.

V štýloch šablón xsl:template sú konštrukcie najvyššej úrovne, ktoré sú deťmi dokumentu. Skôr ako používať // aby ste sa vrátili cez každý uzol v strome dokumentov XML, môžete použiť efektívnejší výraz XPATH:

<xsl:if test="/*/xsl:template" />

1 pre odpoveď č. 2

Je nesprávne predpokladať, že kódový súbor XSLT obsahuje vždy <xsl:template> inštrukcia.

Existujú príklady modulov štýlov XSLT, kde súbor obsahuje iba jeden <xsl:stylesheet> inštrukcie a jednej alebo viacerých globálnych premenných. Takýto modul štýlov je obvykle importovaný / zahrnutý do iného modulu so štýlmi pomocou <xsl:import> alebo <xsl:include> inštrukcie.

Taktiež to, čo definuje XSLT, nie je predpona prvkov, ktoré tvoria pokyny XSLT, Táto predpona nie je povinná "xsl" a niektorí programátori používajú rôzne predpony, ako napr "xslt" alebo "x".

Čo skutočne definuje kód XSLT je priestor názvov XSLT.

Napokon, kódový súbor XSLT nie je zaručený, ani neobsahuje <xsl:stylesheet> smernice, pretože XSLT ponúka synonymum: <xsl:transform>.

Pri zohľadnení všetkých týchto úvah by bol lepší test:

/*[contains("|stylesheet|transform|", concat("|", local-name(), "|")
and
namespace-uri()="http://www.w3.org/1999/XSL/Transform"
)

Pretože existuje možnosť mať vstavané štýly, test uvedený vyššie môže byť mierne upravený tak, aby pokrýval aj tieto:

//*[contains("|stylesheet|transform|", concat("|", local-name(), "|")
and
namespace-uri()="http://www.w3.org/1999/XSL/Transform"
)

0 pre odpoveď č. 3

Prečo potrebujete skontrolovať niečo za "/ xsl: template | xsl: transform"? Tieto musia byť na najvyššej úrovni a môžu iba byť na najvyššej úrovni.