2013-03-23 17 views
7

Mój XSLT wyprowadza niektóre znaczniki z atrybutem xmlns:x="http://something" ... Jak uniknąć tego nadmiarowego atrybutu? Wyjściowy plik XML nigdy nie jest używany ani w x:tag, ani w x:attribute.Omijaj niepotrzebne przestrzenie nazw z wyjścia


PRZYKŁAD XML:

<root><p>Hello</p><p>world</p></root> 

Przykład XSL:

<xsl:transform version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xlink="http://www.w3.org/1999/xlink"> 
<xsl:output encoding="UTF-8" method="xml" version="1.0" indent="no"/> 

<xsl:template match="root"><foo> 
    <xsl:for-each select="p"> 
    <p><xsl:value-of select="." /></p> 
    </xsl:for-each></foo> 
    <xsl:for-each select="x"> 
    <link xlink:href="{x}" /> 
    </xsl:for-each></foo> 
</xsl:template> 

PRZYKŁAD XML wyjściowych:

<foo> 
    <p xmlns:xlink="http://www.w3.org/1999/xlink">Hello</p> 
    <p xmlns:xlink="http://www.w3.org/1999/xlink">world</p> 
</foo> 

xmlns:xlink jest narzutem, nie jest używany!


A typical case gdzie XSLT musi używać nazw ale nie wyjście:

<xsl:value-of select="php:function('regFunction', .)" /> 
+1

Proszę edytować pytanie i dostarczyć dokument XML i źródła kod transformacji. Bez nich nikt nie musi zgadywać. –

+0

OK, edytowałem: źródła XML-IN, XSLT i XML-OUT. –

Odpowiedz

6

Jak Dimitre już powiedział, jeśli nie używasz przestrzeni nazw xlink w dowolnym miejscu XSLT, powinieneś po prostu usunąć deklarację przestrzeni nazw. Jeśli jednak Twój XSLT jest faktycznie używając go gdzieś, że nie zostały nam pokazane, można zapobiec jego jest wysyłany za pomocą atrybutu exclude-result-prefixes:

<xsl:transform version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xlink="http://www.w3.org/1999/xlink" 
    exclude-result-prefixes="xlink"> 
+0

Wielkie dzięki, preludium wyników wykluczenia jest narzędziem! O rozwiązaniu "... po prostu usuń deklarację przestrzeni nazw ...", zredagowałem pytanie, aby uniknąć tego "drobnego przypadku". –

0

prostu usunąć tę deklarację przestrzeni nazw z instrukcją xsl:stylesheet - nie jest używany (a zatem konieczne) w ogóle :

xmlns:xlink="http://www.w3.org/1999/xlink" 

Cała transformacja staje się teraz:

<xsl:transform version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output encoding="UTF-8" method="xml" version="1.0" indent="no"/> 

<xsl:template match="root"><foo> 
    <xsl:for-each select="p"> 
    <p class="a"><xsl:value-of select="." /></p> 
    </xsl:for-each></foo> 
</xsl:template> 
</xsl:transform> 

i po nałożeniu na dostarczonym dokumencie XML:

<root><p>Hello</p><p>world</p></root> 

produkuje rezultat, który jest wolny od nazw:

<foo> 
    <p class="a">Hello</p> 
    <p class="a">world</p> 
</foo> 
+0

Dzięki, edytowałem z typowym przykładem. Drugi to 'xsl: if', który nie jest używany. –

+0

@PeterKrauss, exclude-result-prefixes = "{} oddzielona spacjami lista prefiksów" może w wielu przypadkach pomóc. W innych przypadkach nadal trzeba usunąć przestrzenie nazw według kodu. BTW, nie widzę żadnego 'xsl: if' w twoim opublikowanym kodzie. –

+0

Dzięki, ponownie zredagowałem. –