2009-03-18 20 views
1

ich eine XML-Datei, die in folgendem Format ist:Konvertieren von XML-Dokument für die Verwendung mit Steuer .NET 2.0 TreeView

<root> 
    <category> 
    <doctype> 
     <name>Doc1</name> 
     <site> 
     <name>Site1</name> 
     <target>iframe</target> 
     <url>http://www.gmail.com</url> 
     </site> 
    </doctype> 
    <doctype> 
     <name>Doc2</name> 
     <site> 
     <name>Site2</name> 
     <target>iframe</target> 
     <url>http://www.bbc.co.uk</url> 
     </site> 
    </doctype> 
    </category> 
</root> 

Ich brauche es auf einem Standard-.net 2.0 TreeView-Steuerelement zu verwenden, das erfordert die XML in folgendem Format

<root> 
    <category> 
    <doctype name="Doc1"> 
     <site name = "Site1" target = "iframe" url = "http://www.gmail.com"> 
     </site> 
    </doctype> 
    <doctype name="Doc2"> 
     <site name = "Site2" target = "iframe" url = "http://www.bbc.co.uk"> 
     </site> 
    </doctype> 
    </category> 
</root> 

die größte Komplikation ist die Tatsache, dass einige untergeordneten Knoten der DOCTYPE Knoten Notwendigkeit, auf Attribute umgewandelt werden (dh NAME), während einiger Aufenthalt als untergeordneten Knoten, die Attribute der eigenen erfordern (dh SITE).

Wie kann dies mit XSLT getan werden?

+0

Wenn Sie die Transformation in meiner Antwort auf einem einheitlichen Fall für Namen absetzen können viel einfacher werden würde. Auch bin ich ein wenig unsicher, ob deine Eingabe XML * wirklich * Anführungszeichen hat. Kannst du das auch bestätigen? – Tomalak

+0

Entschuldigung, ich klopfte das auf, versuchen zu imitieren, was ich eigentlich bekomme, aber nicht auf den Fall geachtet und vergaß die Zitate. – eMTeeN

+0

Ich habe meine Antwort so geändert, dass sie zu Ihrer neuen Frage passt. Sie werden feststellen, dass es jetzt viel einfacher ist. – Tomalak

Antwort

3

Die folgende Transformation von XSLT 1.0 macht das, was Sie beabsichtigen.

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="root | category | doctype | site"> 
    <xsl:copy> 
     <xsl:apply-templates select="*" /> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="name | target | url"> 
    <xsl:attribute name="{local-name()}"> 
     <xsl:value-of select="." /> 
    </xsl:attribute> 
    </xsl:template> 

</xsl:stylesheet> 

Ausgang:

<root> 
    <category> 
    <doctype name="Doc1"> 
     <site name="Site1" target="iframe" url="http://www.gmail.com"></site> 
    </doctype> 
    <doctype name="Doc2"> 
     <site name="Site2" target="iframe" url="http://www.bbc.co.uk"></site> 
    </doctype> 
    </category> 
</root> 
+0

würde die einfachere Lösung für die modifizierte Frage apprecaite. Vielen Dank – eMTeeN