2009-03-10 7 views
7

Il controllo dello spazio dei nomi è disabilitato sul server che gestisce le trasformazioni XSL (perché il tizio che ha scritto l'XSL non ha compreso gli spazi dei nomi). Devo apportare modifiche all'XSL ma non riesco a testarlo perché non sono definiti spazi dei nomi, ad esempio.C'è un modo per ignorare i namespace durante una trasformazione XSL?

Invece di

<xsl:template match="ns:element[position()=1]">... 

ha

<xsl:template match="element[position()=1]">... 

quindi non corrisponde a nessuno degli elementi in XML, perché tutti sono tutti qualificati con i namespace.

Non riesco a testare sul server perché non ho accesso ad esso. È inutile correggere l'XSL perché allora il controllo dello spazio dei nomi dovrà essere abilitato e ciò interromperà tutte le altre trasformazioni.

Quindi quello che devo fare è trovare un modo per ignorare i namespace durante una trasformazione XSL. Ho accesso a MSXML, XMLSpy (non riesco a trovare un'opzione qui) e se ho davvero bisogno di poter scrivere qualcosa in C# o in un linguaggio simile.

Come ultima risorsa posso codice un paio di espressioni regolari, ma io davvero non voglio andare giù questa strada, soprattutto quando si tratta di XML ...

In risposta a un commento su ulteriori dettagli:

È un server virtuale di Windows 2003, che esegue un'istanza di un servlet Methode (www.eidosmedia.com). Non so quale tecnica usi questa servlet per eseguire le trasformazioni XSL. Stanno ignorando gli spazi dei nomi perché la persona che ha originariamente scritto l'XSL non li ha capiti e non li ha inclusi nell'XSL. Quindi ora tutti i file XSL (centinaia) non hanno spazi dei nomi.

Potrebbe essere una sfida interessante risolvere tutti questi file in una volta sola, ma non è quello che mi serve in questo momento (e il responsabile del reparto non accetterebbe mai di farlo comunque a causa della quantità di test coinvolti). Tutto quello che voglio sapere è se c'è uno strumento (o una tecnica) disponibile che mi permetta di prendere questi file XSL così com'è e usarli per trasformare un documento XML corrispondente senza tenere conto degli spazi dei nomi. Mi sembra che uno strumento debba esistere, perché il tizio che ha scritto l'XSL originale deve aver usato qualcosa di simile per testare le trasformazioni stesso.

+0

Come si disabilita il controllo dello spazio dei nomi su un server? Non ho mai sentito parlare di una cosa del genere. –

+0

È un prodotto di terze parti (non Microsoft o Sun) che gestisce le trasformazioni. Hanno appena chiesto agli sviluppatori di dare loro un'opzione per disabilitarlo. – ilitirit

+0

Potremmo ottenere maggiori dettagli? Quale tipo di server, ecc. Inoltre, quale problema si vuole affrontare ignorando gli spazi dei nomi? Ignorare gli spazi dei nomi è molto difficile, quindi se conosciamo il problema dietro al problema, potremmo provare ad affrontarlo. –

risposta

5

fare una trasformazione per rimuovere tutti gli spazi dei nomi dall'input prima della trasformazione "reale". Ma ... Non sono sicuro che tu voglia fare . Sembra brutto.

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="*"> 
    <xsl:element name="{local-name()}" > 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:element> 
    </xsl:template> 

    <xsl:template match="@*"> 
    <xsl:attribute name="{local-name()}"> 
     <xsl:value-of select="." /> 
    </xsl:attribute> 
    </xsl:template> 

</xsl:stylesheet> 

risposta originale:

Vorrei che essere un'opzione?

<xsl:template match="*[local-name()='element' and position()=1]">... 

(come mostrato commenti - non sarebbe)

+0

Purtroppo no. Come ho postato in un altro commento, la partita è stata solo un esempio. Ci sono anche funzioni "selezionate". – ilitirit

+0

A parte il fatto che c'è un lavoro richiesto ... Perché non dovrebbe funzionare? Tomalak

+0

Non riesco a pensare a un motivo per cui non dovrebbe funzionare , ma a causa della quantità di lavoro richiesto potrei scrivere regex per rimuovere/inserire spazi dei nomi. Tutto quello che voglio sapere è se c'è uno strumento che consentirà trasformazioni senza spazi dei nomi. Conosco già altre soluzioni che richiedono lavoro. – ilitirit

0

Quanti spazi dei nomi ci sono nel XML trasformarsi?

Se è possibile aggiungere temporaneamente lo spazio dei nomi come spazio dei nomi predefinito del proprio XSL? Ok, questo significa che potrebbe essere necessario modificare lo spazio dei nomi di output, ecc. Ma una volta testato è possibile rimuovere questi ritocchi.

Se ci sono più di 1 che implica che non ci sono collisioni di nomi locali tra i namespace. Potresti modificare l'XML di input di test in modo che tutti gli alias puntino allo stesso spazio dei nomi e quindi esegui il tweak sopra.

+0

Ho contato almeno 10 namespace (è un file SpreadsheetML). Ho già rimosso gli spazi dei nomi da un file di input, ma non è una buona soluzione perché devo farlo ogni volta che provo un nuovo file. – ilitirit

+0

Ouch. :(Dubito che troverai un moderno processore XSL che rispetti se stesso e che permetterà ciò di cui hai bisogno Tristemente penso che gli script di RegEx siano di tua competenza, salva la parola severa con i proprietari del server. – AnthonyWJones

1

Lo sto postando come risposta perché è troppo lungo per essere inserito come commento.

Nessun processore XSLT di cui abbia mai sentito parlare, consente di ignorare completamente gli spazi dei nomi nell'XML di input. Se si dispone di trasformazioni XSL scritte in ignoranza di spazi dei nomi e documenti XML che li utilizzano, è necessario utilizzare il servlet interrotto per eseguire la trasformazione o pre-elaborare i documenti XML per rimuovere gli spazi dei nomi.

La trasformazione che Tomalak ha pubblicato lo farà e, a differenza delle espressioni regolari, lo farà senza rovinare tutto il resto dell'XML. E non è molto lavoro da fare neanche quello. Trasformare concatenare è abbastanza facile.

Problemi correlati