转换XML文档以与.NET 2.0 TreeView控件一起使用

转换XML文档以与.NET 2.0 TreeView控件一起使用,xml,xslt,treeview,.net-2.0,xslt-1.0,Xml,Xslt,Treeview,.net 2.0,Xslt 1.0,我有一个XML文件,格式如下: <root> <category> <doctype> <name>Doc1</name> <site> <name>Site1</name> <target>iframe</target> <url>http://www.gmail.com</

我有一个XML文件,格式如下:

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

文件1
地点1
iframe
http://www.gmail.com
文档2
站点2
iframe
http://www.bbc.co.uk
我需要在标准的.NET2.0TreeView控件上使用它,该控件需要以下格式的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实现这一点?

下面的XSLT1.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>


如果您能确定名称的一致性,我的答案中的转换将变得简单得多。另外,我有点不确定您的输入XML是否真的有引号。你能确认一下吗?抱歉,我试图模仿我实际得到的,但没有注意到这个案例&忘记了引用。我改变了答案以适应你的新问题。你会发现现在简单多了。我想为修改后的问题推荐一个更简单的解决方案。谢谢