2010-10-05 122 views
1

请我想知道是否有人可以请求帮助,因为它相当紧迫。我需要将xml文件的结构转换为另一个xml结构,以便将其绑定到asp.net treeview控件(我是c#开发人员)。我注意到asp.net TreeView控件接受转换文件或XPath表达式,如果一个解决方案,将工作请一些人知道我想知道: 从修改XML结构以使用XSD或XSLT创建嵌套树XML结构

<Skeleton> 
<Category>Carto</Category> 
<SubCategoryName>ET-ET-RS23</SubCategoryName> 
<Filename>V-01.XML</Filename> 
<XmlDefinition>SKELETON</XmlDefinition> 
</Skeleton> 

<Skeleton> 
<Category>Carto 
    <SubCategoryName>ET-ET-RS23 
    <Filename>V-01.XML 
    <XmlDefinition>&lt;SKELETON /&gt;</XmlDefinition> 
    </Filename> 
    </SubCategoryName> 
</Category> 
</Skeleton> 

基本上我想有一个嵌套的树结构,我可以简单地绑定到我的树视图控件。因此,类别包含SubCategoryName以及包含文件名和包含xmldefinition

抱歉,我希望这是有道理的,谢谢

+0

好问题(1)。查看我的答案,获取完整而简短的解决方案。 – 2010-10-05 18:29:26

+0

Ew,混合内容。 (文本作为元素的兄弟。) – LarsH 2010-10-05 19:04:02

回答

2

这个样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()[1]| 
             following-sibling::node()[1]"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="XmlDefinition/text()"> 
     <xsl:value-of select="concat('&lt;',.,'/&gt;')"/> 
    </xsl:template> 
</xsl:stylesheet> 

输出:

<Skeleton> 
    <Category>Carto 
     <SubCategoryName>ET-ET-RS23 
      <Filename>V-01.XML 
       <XmlDefinition>&lt;SKELETON/&gt;</XmlDefinition> 
      </Filename> 
     </SubCategoryName> 
    </Category> 
</Skeleton> 
+0

+1给你和@Dimitre用于如此紧密匹配彼此的解决方案。英雄所见略同。 ;-) – LarsH 2010-10-05 19:06:37

+0

@LarsH,@Alejandro:如果两个不同的头脑(亚历杭德罗和我的大多数人肯定都会)达到几乎相同的解决方案,这就是事实。 Jae! – 2010-10-05 19:28:42

+0

Ja!我非常感谢你的评论,但我不认为自己是一个伟大的思想。 ;) – 2010-10-05 20:02:10

1

这转化:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()[1]"/> 
    <xsl:apply-templates select="following-sibling::node()[1]"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="XmlDefinition/text()"> 
    &lt;<xsl:value-of select="."/>/&gt; 
</xsl:template> 
</xsl:stylesheet> 

当所提供的XML文档施加:

<Skeleton> 
<Category>Carto</Category> 
<SubCategoryName>ET-ET-RS23</SubCategoryName> 
<Filename>V-01.XML</Filename> 
<XmlDefinition>SKELETON</XmlDefinition> 
</Skeleton> 

产生想要的结果

<Skeleton> 
    <Category>Carto 
     <SubCategoryName>ET-ET-RS23 
      <Filename>V-01.XML 
       <XmlDefinition> 
    &lt;SKELETON/&gt; 
       </XmlDefinition> 
      </Filename> 
     </SubCategoryName> 
    </Category> 
</Skeleton> 
+0

你好,我试过这个,但我得到CartoET-ET-R23V-01.XML ... – 2010-10-05 19:29:04

+0

我希望能得到你在结果中描述的实际xml结构..am我做错了什么? – 2010-10-05 19:29:52

+0

@ michael-bullock:如果你有'',或者你发出的结果是<?xsl:value-of>,你会得到这样的结果。结果,你应该把结果当作标记 – 2010-10-05 19:32:32