2008-09-27 15 views
10

Mam dokument XML z elementami bez nazwy i chcę użyć XSLT, aby dodać do nich przestrzenie nazw. Większość elementów będzie w przestrzeni nazw A; kilka będzie w przestrzeni nazw B. Jak to zrobić?Dodaj obszar nazw do elementów

Odpowiedz

13

Z foo.xml

<foo x="1"> 
    <bar y="2"> 
     <baz z="3"/> 
    </bar> 
    <a-special-element n="8"/> 
</foo> 

i foo.xsl

<xsl:template match="*"> 
     <xsl:element name="{local-name()}" namespace="A" > 
      <xsl:copy-of select="attribute::*"/> 
      <xsl:apply-templates /> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="a-special-element"> 
     <B:a-special-element xmlns:B="B"> 
      <xsl:apply-templates match="children()"/> 
     </B:a-special-element> 
    </xsl:template> 

</xsl:transform> 

uzyskać

<foo xmlns="A" x="1"> 
    <bar y="2"> 
     <baz z="3"/> 
    </bar> 
    <B:a-special-element xmlns:B="B"/> 
</foo> 

Czy tego szukasz?

+0

Yup; Wyszukałem odpowiedź przed Twoim postem i zasadniczo było to samo. Jedyną różnicą jest to, że zamiast tego używam , ale uważam, że są funkcjonalnie identyczne. –

0

Oto co mam do tej pory:

<xsl:template match="*"> 
    <xsl:element name="{local-name()}" namespace="A" > 
     <xsl:apply-templates /> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="a-special-element"> 
    <B:a-special-element xmlns:B="B"> 
     <xsl:apply-templates /> 
    </B:a-special-element> 
</xsl:template> 

To prawie działa; problemem jest to, że nie kopiuje atrybutów. Z tego, co przeczytałem w ten sposób, xsl: element nie ma sposobu na skopiowanie wszystkich atrybutów z elementu tak jak jest (użycie zestawu atrybutów nie wydaje się, aby go wyciąć).

+1

Nie przeczytałeś właściwej dokumentacji. Użyj siły, przeczytaj specyfikację, jest bardzo dobrze napisana i dostępna. – ddaa

2

Będziesz potrzebować dwóch głównych składników tego przepisu.

Zapasem sosów będzie identity transform, a główny smak zostanie nadany przez atrybut namespace na xsl:element.

Poniższy, nietestowany kod, powinien dodać przestrzeń nazw http://example.com/ do wszystkich elementów.

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

<xsl:template match="@*|node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

Wiadomość osobista: Witaj, Jeni Tennison. Wiem, że to czytasz.

Powiązane problemy