2011-02-27 16 views
5

subnodes dayalı sıralamatüm XDocument aşağıdaki biçimde bir 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> 

Ben C# ve şu anda xmldocument kullanıyorum.

teşekkür ederim

+0

Kafam karıştı çünkü xpath 'etiketi ... Eğer bir düğüm seti seçmek istiyorsanız, o zaman doğru teknoloji ve XPath olabilir. Bir düğüm kümesini düzgün bir şekilde sıralamak istiyorsanız, XPath motor ana diline ihtiyacınız olacaktır. Bir XML ağacını dönüştürmek istiyorsanız, standart kaynak XSLT'dir. –

+0

Biliyorum, sorunum için çalışmayı başaramıyorum. – vondip

+0

İyi soru, +1. "ContactGrp" öğelerinin herhangi bir yuvalanma seviyesi için çalışan eksiksiz, kısa ve kolay bir XSLT çözümü için yanıtımı görün. :) –

cevap

2

gibi bir şey yapabileceğini:

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

teşekkürler. Xslt’in gitmenin doğru yolu olduğunu biliyordum, ancak doğru seviyeyi sıralamak için xml’i alamadım. teşekkür ederim – vondip

4

Eğer bir stil ve daha sonra belgeyi dönüştürmek için kullanmak istiyorsanız bu

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

Bu dönüşüm :

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

sağlanan XML belgesindeki uygulanır:

<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> 
not Do:

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

aranan, doğru sonucu üretir doğru sonuçlar her zaman üretilecek - contactGrp öğelerinin iç içe geçme düzeyinden bağımsız olarak

İlgili konular