2011-02-27 3 views
5

하위 노드에 따라 정렬이은 전체하여 XDocument 나는 다음과 같은 형식의 XML을

<?xml version="1.0" encoding="utf-8"?> 
<contactGrp name="People"> 
    <contactGrp name="Developers"> 
    <customer name="Brad" ></customer> 
    <customer name="Mike" ></customer> 
    <customer name="Smith" ></customer> 
    </contactGrp> 
    <contactGrp name="QA"> 
    <customer name="abi" ></customer> 
    <customer name="John" ></customer> 
    </contactGrp> 
</contactGrp> 

저는 현재 C# 및 현재 xmldocument를 사용하고 있습니다.

당신을 감사

+0

'xpath' 태그 때문에 혼란 스러워요 ... 노드 집합을 선택하려면 XPath가 올바른 기술을 사용할 수 있습니다. 노드 집합을 올바르게 정렬하려면 XPath 엔진 호스트 언어가 필요합니다. XML 트리를 변환하려면 standar 리소스가 XSLT입니다. –

+0

알다시피, 나는 내 문제를 해결할 수 없다. – vondip

+0

좋은 질문입니다, +1. 'contactGrp' 요소의 모든 중첩 수준에서 작동하는 간단하고 쉬운 XSLT 솔루션에 대한 내 대답을 확인하십시오. :) –

답변

2

같은 뭔가를 할 수 :

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" 
> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="/contactGrp"> 
    <contactGrp name="Developers"> 
     <xsl:apply-templates select="contactGrp"/> 
    </contactGrp> 
    </xsl:template> 

    <xsl:template match="contactGrp/contactGrp"> 
    <contactGrp> 
     <xsl:attribute name="name"> 
     <xsl:value-of select="@name"/> 
     </xsl:attribute> 

     <xsl:for-each select="customer"> 
     <xsl:sort select="@name"/> 
     <xsl:copy-of select="."/> 
     </xsl:for-each> 

    </contactGrp> 
    </xsl:template> 

</xsl:stylesheet> 
+0

감사합니다. 나는 xslt가 올바른 방법이라는 것을 알았지 만 xml로 정확한 레벨을 정렬 할 수 없었다. 고맙습니다 – vondip

4

당신이 스타일을하고 문서 변환을 사용하려면 당신이

var doc = XDocument.Load(/* ... */); 

foreach (var g in doc.Descendants("contactGrp")) 
{ 
    var customers = g.Elements("customer").ToList(); 
    customers.Remove(); 
    g.Add(customers.OrderBy(c => c.Attribute("name").Value)); 
} 
2

이 변환을 :

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

<xsl:template match="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="contactGrp"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"> 
    <xsl:sort select="@name"/> 
    </xsl:apply-templates> 
    </xsl:copy> 
</xsl:template> 
</xsl:stylesheet> 
,

제공되는 XML 문서에 적용 :

<contactGrp name="People"> <contactGrp name="Developers"> <customer name="Brad" /> <customer name="Mike" /> <customer name="Smith" /> </contactGrp> <contactGrp name="QA"> <customer name="abi" /> <customer name="John" /> </contactGrp> </contactGrp> 
주의 마십시오 :

<contactGrp name="People"> 
    <contactGrp name="Developers"> 
     <customer name="Mike" ></customer> 
     <customer name="Brad" ></customer> 
     <customer name="Smith" ></customer> 
    </contactGrp> 
    <contactGrp name="QA"> 
     <customer name="John" ></customer> 
     <customer name="abi" ></customer> 
    </contactGrp> 
</contactGrp> 

이 원하는, 올바른 결과를 생산하는 올바른 결과는 항상 생산 될 것이다 - 요소의 중첩 수준에 관계없이

관련 문제