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.
Dobre pytanie (+1). Zobacz moją odpowiedź na krótkie i proste rozwiązanie, :) –
* "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
Miałem na myśli widoczny identyfikator przed nazwą tagu. –