2011-11-16 41 views
5

Tôi đang cố gắng tạo trang html bằng cách sử dụng xslt (sử dụng VS 2010 làm trình chỉnh sửa và 'trình biên dịch/biến áp'). Hầu hết các công trình này hoạt động tốt và tạo ra xhtml hợp lệ, nhưng khi cố gắng tạo danh sách được sắp xếp với sự trợ giúp của <xsl:sort /> thì thứ tự không bị ảnh hưởng chút nào. Tôi đã thấy nó hoạt động, nhưng khi cố gắng xác định vấn đề của tôi và tạo mã mẫu bên dưới, không có ai trong số <xsl:sort /> của tôi hoạt động.xsl: sắp xếp, tại sao nó không hoạt động?

Xin vui lòng, ai có thể cho tôi thấy lỗi của tôi.

Dưới đây là các tệp mẫu của tôi.

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

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

Thực ra nó hoạt động khá tốt. Tôi không chắc vấn đề của bạn là gì. – FailedDev

+0

Tôi thấy cùng một vấn đề mà anh ta có trong vs2010, nhưng mã hoạt động tốt trong vs2008. Giống như một số loại vấn đề xử lý xml. – Bert

Trả lời

5

Bạn có thể sửa lỗi này trong stylesheet của bạn bằng cách thay đổi phiên bản stylesheet đến 1.0. Nói cách khác, thay đổi

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

này dường như là một lỗi trong .net 4 XSL Transform mã. Xem câu hỏi về stackoverflow có liên quan này, Problem with XSL sorting.

Điều gì sẽ xảy ra là bất cứ khi nào bạn cố sắp xếp theo thuộc tính, nó thực sự sắp xếp theo phần tử con đầu tiên. Ví dụ, thay đổi XML của bạn vào đó và tên sẽ sắp xếp đúng:

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

Tôi tìm thấy một phản hồi nào từ Microsoft về vấn đề ở đây, http://connect.microsoft.com/VisualStudio/feedback/details/620628/problem-with-xsl-sort-nodes-when-using-xslcompiledtransform, dẫn tôi đến sửa chữa tôi đã gợi ý ở trên. Bạn có thể thử chơi xung quanh với số phiên bản cho biểu định kiểu để xem những gì và không hoạt động.

+0

+1 Đẹp bắt :) – FailedDev

Các vấn đề liên quan