2010-04-20 15 views
10

Mam XML jak poniżej:Jak zmienić nazwę atrybutu za pomocą XSLT?

<person name="foo" gender = "male" /> 

Chcę przekształcić go

<person id="foo" gender="male" /> 

Czy istnieje sposób to zrobić przy użyciu XSLT?

  • będę mieć dużo węzłów potomnych osobiście

  • będę mieć więcej atrybutów w osobie.

+0

To bardziej przypomina zmianę nazwy atrybutu, chyba że jest więcej do faktycznego scenariusza, który nie wchodzi w grę. –

Odpowiedz

13

Jest to bardzo proste: Użyj tożsamość przekształcać i utworzyć szablon, który przekształca atrybut name:

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

<xsl:template match="@name"> 
    <xsl:attribute name="id"> 
     <xsl:value-of select="."/> 
    </xsl:attribute> 
</xsl:template> 

to będzie zostawić wszystko w dokumencie z wyjątkiem name atrybutów dokładnie tak, jak to jest. Jeśli chcesz zmienić atrybut name na elementach person, dodaj bardziej restrykcyjną wartość XPath w atrybucie szablonu match, np. person/@name.

+0

Krótkie, czyste, proste. Doskonała odpowiedź. – markusk

+0

Pięknie wykonany. – unj2

-1

To powinno wystarczyć, nie całkiem pewny {nazwa()} ale można zastąpić, że z „osoby”

> <xsl:template match="person"> 
>  <xsl:element name="{name()}"> 
>   <xsl:attribute name="id"> 
>   <xsl:value-of select="@name"/> 
>   </xsl:attribute> 
>   <xsl:attribute name="gender"> 
>   <xsl:value-of select="@gender"/> 
>   </xsl:attribute> 
>  </xsl:element> 
>  </xsl:template> 
+0

Czy muszę utworzyć atrybut dla każdego atrybutu, który mam? Czy mogę po prostu skopiować wszystkie atrybuty oprócz identyfikatora? – unj2

+0

To szalone, aby użyć 'xsl: element', szablonu wartości atrybutu i funkcji' name() ', aby utworzyć element, którego nazwę już znasz. Zastąp '' '' i możesz również zastąpić elementy 'xsl: attribute' znakami AVT. Zrób to wszystko, a odpowiedź wciąż nie będzie właściwa (odpowiedź na pytanie kunjaana brzmi "nie, chyba że robisz to w ten sposób"), ale będzie mniej błędna. –

+0

Po prostu staram się zapewnić ogólne rozwiązanie, które zadziała dla dowolnego elementu, niezależnie od jego nazwy. Jeśli będzie to tylko element , to oczywiście prostsze zakodowane rozwiązanie będzie lepsze. – derek

Powiązane problemy