Преобразование XML-документа для использования с элементом управления .NET 2.0 TreeView - PullRequest
1 голос
/ 18 марта 2009

У меня есть 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>

Мне нужно использовать его в стандартном элементе управления TreeView .net 2.0, для которого требуется 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 необходимо преобразовать в атрибуты (т. Е. ИМЯ), в то время как некоторые остаются в качестве дочерних узлов, которым требуются свои собственные атрибуты (то есть SITE).

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

1 Ответ

3 голосов
/ 18 марта 2009

Следующее преобразование 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>
...