2009-03-18 2 views
1

У меня есть файл XML, который находится в следующем формате:Преобразование XML-документа для использования с .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> 

мне нужно использовать его на стандартном .net управления 2,0 TreeView, который требует XML в следующем формате

<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> 

Самая большая сложность заключается в том, что некоторые дочерние узлы необходимости DOCTYPE узла должны быть преобразованы в атрибуты (например, имя), в то время как некоторые пребывания в качестве дочерних узлов, которые требуют атрибуты своих собственных (т.е. МЕСТЕ).

Как это можно сделать с помощью XSLT?

+0

Если вы можете поселиться на последовательном случае для преобразования имен в моем ответе стало бы намного проще. Кроме того, я немного не уверен, что ваш входной XML * действительно * имеет кавычки. Можете ли вы это подтвердить? – Tomalak

+0

извинения, я постучал, пытаясь имитировать то, что я на самом деле получаю, но не обратил внимания на случай и забыл о котировках. – eMTeeN

+0

Я изменил свой ответ, чтобы соответствовать вашему новому вопросу. Вы обнаружите, что теперь это намного проще. – Tomalak

ответ

3

Следующая трансформация XSLT 1.0 делает то, что вы намереваетесь.

<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> 

Выход:

<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

оценил бы более простое решение для измененного вопроса. благодаря – eMTeeN

Смежные вопросы