2009-03-30 13 views
3

Ich würde verknüpfen XML zu verwandeln mit Attributen wie dem 'name' Attribut in der folgenden:Wie kann ich ein Elementattribut in XSLT in einen Elementnamen umwandeln?

<books> 
    <book name="TheBumperBookOfXMLProgramming"/> 
    <book name="XsltForDummies"/> 
</books> 

in Elemente genannt, was im Namen Attribut war:

<books> 
    <TheBumperBookOfXMLProgramming/> 
    <XsltForDummies/> 
</books> 

XSLT verwenden. Irgendwelche Ideen?

+0

Sowohl die Die folgenden Antworten sind gültig. @ Divo ist genau das, was ich gefragt habe, @ Martins ist eine zusätzliche Überlegung zu beachten. Danke an beide :) – Brabster

+0

Warum willst du das machen? Es macht nicht viel Sinn. – AmbroseChapel

+0

@Ambrose - Neugier? Außerdem scheint es einfacher zu sein, ein XML-Schema für das letztere zu definieren. – Brabster

Antwort

4

Sie Elemente mit Namen xsl:element mit erstellen:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="/"> 
    <books> 
     <xsl:apply-templates /> 
    </books> 

    </xsl:template> 

    <xsl:template match="book"> 
    <xsl:element name="{@name}" /> 
    </xsl:template> 

</xsl:stylesheet> 
+0

Dadurch bleibt die Möglichkeit offen, ein ungültiges xml (read: not xml) zu erstellen, da der Zeichensatz mit Elementnamen eingeschränkter ist. – pc1oad1etter

+0

@ pc1oad1etter: Wie ist es mehr eingeschränkt? Soweit ich weiß, sind beide Namen nach dieser [Produktionsregel] (http://www.w3.org/TR/REC-xml/#NT-Name) –

3
<xsl:template match="book"> 
    <xsl:element name="{@name}"> 
     <xsl:copy-of select="@*[name()!='name'] /> 
    </xsl:element> 
</xsl:template> 

diese auch Kopien über alle Eigenschaften auf <book> nicht 'name' genannt

<book name="XsltForDummies" id="12" /> 

in

verwandeln
<XsltForDummies id="12 />