2011-11-16 26 views
5

xslt kullanarak html sayfaları oluşturmaya çalışıyorum (editör olarak VS 2010 ve 'compiler/transformer' kullanarak). Bunun çoğu iyi çalışır ve geçerli xhtml üretir, ancak <xsl:sort /> yardımı ile sıralanmış bir liste oluşturmaya çalışırken, sipariş hiç etkilenmez. Çalıştığını gördüm, ancak sorunumu belirlemeye ve aşağıdaki örnek kodu oluşturmaya çalışırken, <xsl:sort />'um hiçbiri işe yaramadı.xsl: sort, neden çalışmıyor?

Lütfen, kim bana hatamı gösterebilir.

Örnek dosyam aşağıdadır.

örnek.xml

<?xml version="1.0"?> 
<?xml-stylesheet type="text/xsl" href="sample.xsl" ?> 
<people> 
    <person name="Jack" age="12"> 
     <adress>First road</adress> 
    </person> 
    <person name="Bob" age="8"> 
     <adress>Third road</adress> 
    </person> 
    <person name="Peter" age="20"> 
     <adress>Second road</adress> 
    </person> 
    <person name="Juli" age="65"> 
     <adress>Last road</adress> 
    </person> 
    <person name="Abbot" age="21"> 
     <adress>No road</adress> 
    </person> 
</people> 

örnek.xsl

<?xml version="1.0" encoding="iso-8859-1"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml"> 

    <xsl:output 
     method="xml" 
     omit-xml-declaration="yes" indent="yes" 
     doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
     doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" /> 

    <xsl:template match="/"> 
     <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
      <head> 
       <title>Sample</title> 

       <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
      </head> 

      <body> 
       <h2>By @name</h2> 
       <div> 
        <xsl:for-each select="people/person"> 
         <xsl:sort select="@name" data-type="text" order="ascending" /> 
         <xsl:value-of select="@name" /> 
         <xsl:element name="br" /> 
         <xsl:text /> 
        </xsl:for-each> 
       </div> 
       <hr /> 
       <h2>By @age</h2> 
       <div> 
        <xsl:for-each select="people/person"> 
         <xsl:sort select="@age" data-type="number" order="ascending" /> 
         <xsl:value-of select="@age" /> 
         <xsl:element name="br" /> 
         <xsl:text /> 
        </xsl:for-each> 
       </div> 
       <hr /> 
       <h2>By adress</h2> 
       <div> 
        <xsl:for-each select="people/person"> 
         <xsl:sort select="adress" data-type="text" order="ascending" /> 
         <xsl:value-of select="adress" /> 
         <xsl:element name="br" /> 
         <xsl:text /> 
        </xsl:for-each> 
       </div> 
      </body> 
     </html> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Aslında gayet iyi çalışıyor. Senin sorunun ne olduğundan emin değilim. – FailedDev

+0

Ben vs2010 içinde aynı sorunu görüyorum, ancak kod vs2008 iyi çalışıyor. Bir çeşit xml işlemci sorununa benziyor. – Bert

cevap

5

Sen 1,0'a stil versiyonunu değiştirerek stil bu çözebilirsiniz. Diğer bir deyişle, bu kod dönüşümü XSL .net 4 bir hata gibi görünen

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml"> 

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml"> 

için değiştirin. İlgili ilgili stackoverflow sorusuna bakın, Problem with XSL sorting.

Bir özellik tarafından sıralamaya çalıştığınızda gerçekleşen şey aslında ilk alt öğe tarafından sıralanır. Örneğin, bu şekilde XML değiştirebilir ve isimleri düzgün sıralanır:

<?xml version="1.0"?> 
<?xml-stylesheet type="text/xsl" href="Sample.xslt" ?> 
<people> 
    <person name="Jack" age="12"> 
    <name>Jack</name> 
    <adress>First road</adress> 
    </person> 
    <person name="Bob" age="8"> 
    <name>Bob</name> 
    <adress>Third road</adress> 
    </person> 
    <person name="Peter" age="20"> 
    <name>Peter</Name> 
    <adress>Second road</adress> 
    </person> 
    <person name="Juli" age="65"> 
    <name>Juli</Name> 
    <adress>Last road</adress> 
    </person> 
    <person name="Abbot" age="21"> 
    <name>Abbot</Name> 
    <adress>No road</adress> 
    </person> 
</people> 

Ben yukarıda düzeltme önerisi götürdü Burada söz konusu, http://connect.microsoft.com/VisualStudio/feedback/details/620628/problem-with-xsl-sort-nodes-when-using-xslcompiledtransform, yaklaşık Microsoft'tan bir yanıt buldum. Neyin işe yarayıp neyin işe yaramadığını görmek için stil sayfasının sürüm numarası ile oynamayı deneyebilirsiniz.

+0

+1 Güzel yakalama :) – FailedDev