2010-08-12 13 views
10

Mam plik wejściowy, który używa przestrzeni nazw mojej firmy w domyślnej przestrzeni nazw (xmlns="companyURL"), ale chcę, aby mój plik wyjściowy używał czegoś innego niż domyślny obszar nazw (xmlns:cmp="companyURL"). Więc budować swój plik używając nazw cmp, ale potem chcę skopiować niektórych elementów wewnętrznych:Zmienianie przestrzeni nazw dla pliku XML w XSL Tłumaczenie

<xsl:element name="cmp:container"> 
    <xsl:for-each select="foo"> 
    <xsl:copy-of select="." /> 
    </xsl:for-each> 
</xsl:element> 

Niestety, co to robi jest zdefiniowanie domyślnej przestrzeni nazw dla każdej z tych wewnętrznych elementów, dzięki czemu plik niewiarygodnie gadatliwy i brzydki. Uproszczony przykład:

Źródło:

<foo xmlns="companyURL"> 
    <num1>asdf</num1> 
    <num2>ghjkl</num2> 
</foo> 

Okazuje się:

<cmp:container xmlns:cmp="companyURL"> 
    <num1 xmlns="companyURL">asdf</num1> 
    <num2 xmlns="companyURL">ghjkl</num2> 
</cmp:container> 

Oczywiście companyURL jest duża i długa i brzydkie, i to jest taka sama w obu miejscach, tak bym preferujemy powyższy wynik, aby uzyskać następujące wyniki:

<cmp:container xmlns:cmp="companyURL"> 
    <cmp:num1>asdf</cmp:num1> 
    <cmp:num2>ghjkl</cmp:num2> 
</cmp:container> 

Czy jest to prosty sposób, czy powinienem przekonwertować wszystko w przestrzeni nazw cmp na domyślny obszar nazw? Wolałbym użyć jawnego nazewnictwa przestrzeni nazw, jeśli to możliwe, pomaga to w zrozumieniu XSLT w moim doświadczeniu.

+0

Dobre pytanie (+1). Zobacz moją odpowiedź na krótkie i proste rozwiązanie, :) –

+0

* "chcę, aby mój plik wyjściowy używał czegoś innego niż domyślny obszar nazw" * >> po twoim przykładzie, zmiana prefiksu (lub domyślnie na prefiks) nie oznacza zmiany przestrzeń nazw. Elementy z punktu widzenia XML + NS pozostaną równe (localname + namespace pozostaną niezmienione), mimo że prefiks jest inny. – Abel

+0

Miałem na myśli widoczny identyfikator przed nazwą tagu. –

Odpowiedz

10

Ta przemiana:

<xsl:template match="*"> 
    <xsl:element name="cmp:{name()}" namespace="CompanyURL"> 
     <xsl:copy-of select="@*"/> 
     <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 
<xsl:template match="/*"> 
    <cmp:container xmlns:cmp="CompanyURL"> 
     <xsl:copy-of select="@*"/> 
     <xsl:apply-templates/> 
    </cmp:container> 
</xsl:template> 
</xsl:stylesheet> 

gdy wykonywane na dostarczonych dokumentów XML:

<foo xmlns="companyURL"> 
    <num1>asdf</num1> 
    <num2>ghjkl</num2> 
</foo> 

produkuje Wanted, poprawny wynik:

<cmp:container xmlns:cmp="CompanyURL"> 
    <cmp:num1>asdf</cmp:num1> 
    <cmp:num2>ghjkl</cmp:num2> 
</cmp:container> 
+1

Dlaczego masz '' w swoim XSLT? –

+2

@ adam_0: To kopiuje wszystkie atrybuty elementu. W twoim konkretnym przykładzie nie ma żadnych atrybutów, ale jeśli chcemy używać tego kodu jako generalnego konwertera, musi on poprawnie konwertować wszystkie dokumenty - w tym takie, w których występują elementy z atrybutami. –

+0

Mój schemat XML określa, że ​​nie będzie żadnych atrybutów, więc zgaduję, że dobrze jest opuścić ten wiersz? –

Powiązane problemy