2009-05-13 19 views
33

Chciałbym wziąć dane z niektórych plików XML i przekształcić je w nowym dokumencie XML. Jednak nie chcę, aby definicja obszaru nazw w XSLT występowała w dokumencie wynikowym.XSL: Unikać eksportu defintions przestrzeni nazw do wynikająca dokumentów XML

Innymi słowy:

źródło:

<Namespace:Root xmlns:Namespace="http://www.something.com"> 

stylów:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:Namespace="http://www.something.com"> 

wynik:

<resultRoot xmlns:Namespace="http://www.something.com"> 
<!--I don't want the Namespace definition above--> 

Używam msxsl do transformacji.

Odpowiedz

60

Można użyć atrybutu elementu xsl:stylesheetexclude-result-prefixes stłumić nazw z dokumentu wyjściowego:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:Namespace="http://www.something.com" 
     exclude-result-prefixes="Namespace"> 

</xsl:stylesheet> 

Aby stłumić wiele nazw z dokumentu wyjściowego określić je oddzielone spacją:

exclude-result-prefixes="ns1 ns2 ns3" 

Od XSLT specification:

Gdy arkusz stylów używa deklarację przestrzeni nazw tylko dla celów adresowania drzewa źródłowego, określając prefiks w wykluczać-result-prefiksy atrybut pozwoli uniknąć zbędnych deklaracji przestrzeni nazw w drzewo wyników.

-4

użytku przesuwnych element prefiksy = "nazw"

jak:

<xsl:stylesheet 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:datetime="http://exslt.org/dates-and-times" 
xmlns:str="http://exslt.org/strings" 
xmlns:exsl="http://exslt.org/common" 
xmlns:uw="xalan://ru.sbtc.util.XSLUtil" 
extension-element-prefixes="exsl str datetime uw" 
version="1.0"> 
+0

Ja zakładając, że oznaczało wykluczenie-wynikowe prefiksy? –

+0

Używamy prefiksów elementów rozszerzenia i działa dobrze. – alamar

+2

Przedrostki elementu rozszerzenia mają ten sam efekt, ale mają dodatkowy efekt. Wszystkie elementy, które umieścisz w jednym z tych obszarów nazw, zostaną zinterpretowane jako element rozszerzenia (a nie dosłowny element wyniku). To może być odpowiednie dla przykładów, które masz w swojej odpowiedzi. Ale jeśli nie chcesz tego dodatkowego zachowania, po prostu użyj preludiów wyniku wykluczenia –

9

Odpowiedź divo została już wybrana i odpowiednio.

Ale jeśli chcesz głębiej kopać, zapoznaj się z rozdziałem "Too many namespaces" w moim magnum opus w dziko popularnym temacie "Przestrzenie nazw w XSLT". (Tak, to miało być tongue-in-cheek. :-))

+0

Witaj @Evan! Bardzo pomocny link! Sztuczka polegająca na tym, że nie ma niepożądanych przestrzeni nazw podczas korzystania z kopii, jest właśnie tym, czego chciałem. Zaskoczyło mnie jednak to, że ta sztuczka naprawdę nie działa dla XSLT 2.0 (np. Przy użyciu XALAN), ale musisz podążać ścieżką, którą nakreśliłeś na 2.0. W XSLT 1.0 (na przykład przy użyciu 'xsltproc') działało dobrze. Tak więc przejście z XSLT 1.0 na procesor XSLT 2.0 może istotnie zmienić wynik znacznie, chociaż semantycznie dodatkowe przestrzenie nazw nie powinny być problemem w dół, z wyjątkiem może dla aspektów objętościowych. –