2011-11-16 3 views
5

저는 xslt (VS 2010을 편집기와 '컴파일러/변환기'로 사용)를 사용하여 HTML 페이지를 생성하려고합니다. 대부분이 잘 작동하고 유효한 xhtml을 생성하지만, <xsl:sort />을 사용하여 정렬 된 목록을 생성하려고하면 순서가 전혀 영향을받지 않습니다. 나는 그것이 작동하는 것을 보았지만, 내 문제를 결정하고 아래의 샘플 코드를 만들려고 할 때, 내 <xsl:sort /> 중 아무 것도 작동하지 않았다.xsl : sort, 왜 작동하지 않습니까?

제발, 누가 내 실수를 표시 할 수 있습니까?

다음은 샘플 파일입니다.

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

사실 아주 잘 작동합니다. 나는 당신의 문제가 무엇인지 모르겠습니다. – FailedDev

+0

그가 vs2010에있는 것과 동일한 문제를보고 있지만 코드가 vs2008에서 올바르게 작동합니다. 일종의 xml 프로세서 문제처럼 보입니다. – Bert

답변

5

당신은 1.0 스타일 시트의 버전을 변경하여 스타일 시트에서이 문제를 해결할 수 있습니다. 즉,이 코드를 변환 XSL은 .NET 4에서 버그가 수 있도록 나타납니다

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

로 변경합니다. 이 관련된 stackoverflow 질문, Problem with XSL sorting을 참조하십시오.

속성에 따라 정렬을 시도 할 때마다 실제로 나타나는 것은 첫 번째 하위 요소에 의해 정렬됩니다. 예를 들어, 다음에 XML을 변경하고 이름이 제대로 정렬합니다 :

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

은 제가 위에 제시 한 수정를 알려준 여기에 문제 http://connect.microsoft.com/VisualStudio/feedback/details/620628/problem-with-xsl-sort-nodes-when-using-xslcompiledtransform에 대한 마이크로 소프트의 응답을 발견했다. 스타일 시트의 버전 번호를 가지고 놀고 시도해 볼 수도 있습니다.

+0

+1 좋은 캐치 :) – FailedDev