Domanda

Ancora una volta una cosa semplice. Ho un foglio di stile che analizza i file XML e XSL. In sostanza, si cerca di rilevare se l'XML è un foglio di stile con:

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

E 'in effetti rilevare i fogli di stile. Ha problemi con i file XML, però, che generano un " Non definito namespace prefix - 'xsl'" errore. (In XMLSpy. Errori simili nel progetto su cui sto lavorando.)

che sto facendo qualcosa di sbagliato. Qualche suggerimento su come migliorare questo foglio di stile?


Alcune informazioni aggiuntive: Si tratta di un foglio di stile che è destinata ad analizzare altri file XML, non importa ciò che essi contengono. Dovrebbe essere in grado di trasformarsi ancora, e lo fa bene. Non ha alcun problema trasformando altri (normali) fogli di stile sia. Il problema arriva quando si tenta di trasformare un file XML regolare. Eppure non tutti i file XML ...


Come si è visto, l'errore è un'altra cosa. I file XML che ho cercato di trasformare contengono un'istruzione di elaborazione. Questo uno: <?xml-stylesheet href="..\MyStylesheet.xsl" type="text/xsl"?>
Il problema che ho ora è che quando elaboro un file XML che contiene questo PI, l'XSLT inizia segnala l'errore sulla definito namespace prefix. Allora, come faccio a dire il processore XSLT di ignorare questa istruzione di elaborazione?

È stato utile?

Soluzione

Doppio controllo come avete dichiarato il namespace xsl e quali namespace prefix-che avete scelto.

È necessario assicurarsi che il prefisso xsl spazio dei nomi è definito nel foglio di stile, se si desidera utilizzare nelle vostre espressioni XPath. Si otterrà che di errore quando si tenta di utilizzare un prefisso dello spazio dei nomi che ha non è stata dichiarata.

Se non viene dichiarato da nessuna parte più in alto nel foglio di stile (in genere sull'elemento documento come questo: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">), o se si è scelto un prefisso diverso spazio dei nomi (ad esempio, ha dichiarato come " XSLT "come questo: xmlns:xslt="http://www.w3.org/1999/XSL/Transform"), poi, quando si tenta di riferimento ' xsl ' non si sa cosa si sta riferendo.

È possibile dichiarare il prefisso di namespace xsl sul tuo estratto conto if come un test rapido:

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

  

Qualche suggerimento su come migliorare questo   foglio di stile?

È possibile semplificare la vostra condizione di test per selezionare gli elementi xsl:template, piuttosto che valutare la count() di loro. I risultati di test="//xsl:template" valuteranno come true() se si seleziona qualcosa, e false() se non è selezionato.

In fogli di stile xsl:template sono costrutti di alto livello che sono figli dell'elemento documento. Piuttosto che usare // a recurse attraverso ogni nodo nell'albero del documento XML, è possibile utilizzare un'espressione XPath più efficiente:

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

Altri suggerimenti

Non è corretto supporre che un file di codice XSLT contiene sempre un'istruzione <xsl:template> .

Ci sono esempi di moduli foglio di stile XSLT in cui il file contiene solo un'istruzione <xsl:stylesheet> e uno o più variabili a livello globale. Modulo Tale foglio di stile è tipicamente importata / incluso in un altro modulo foglio di stile utilizzando un'istruzione <xsl:import> o <xsl:include>.

Inoltre, ciò che definisce XSLT non è il prefisso degli elementi che costituiscono le istruzioni XSLT . Questo prefisso non ha il compito di essere "xsl" e alcuni programmatori utilizzano diversi prefissi, come "xslt" o "x".

Ciò che definisce veramente codice XSLT è il namespace XSLT .

Infine, un file di codice XSLT non è garantito anche a contenere un <xsl:stylesheet> direttiva , perché offre XSLT un sinonimo:. <xsl:transform>

Prendendo in considerazione tutte queste considerazioni, una prova migliore sarebbe:

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

Perché esiste la possibilità di avere fogli di stile incorporati , il test sopra può essere leggermente modificato per coprire questi così:

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

Perché avete bisogno di controllare nulla al di là "xsl /: template | xsl: trasformare"? Coloro che devono essere al livello più alto, e possono solo essere al livello superiore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top