2012-03-09 5 views
0

У меня есть код ниже, который извлекает записи из соответствующего файла plmxml и отображает записи. Я показываю license_status 0 как автора и 1 как потребитель. Я хочу, чтобы сортировать license_status как автора и пользователя при отображении вывода? Я показываю его как html. Как мне это сделать ?Сортировка в xslt?

Заранее спасибо

<?xml version="1.0"?> 

<!-- 

    Filename: default_xml_template.xsl 

    Default xsl template file for XML report 

--> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:plm="http://www.plmxml.org/Schemas/PLMXMLSchema"> 

<!-- Defining output as HTML --> 
<xsl:output method="html" indent="yes"/> 

<!-- Defining Global Variables 

     These are defined to avoid redundancy and use variables throughout the xsl document 
--> 
<xsl:variable name="trvrootref" select="/plm:PLMXML/plm:Header/@traverseRootRefs"/> 
<xsl:variable name="roid" select="substring-after($trvrootref,'#')"/> 
<xsl:variable name="roe" select="/plm:PLMXML/plm:ProductView/plm:Occurrence[@id=$roid]"/> 
<xsl:variable name="rprid" select="substring-after($roe/@instancedRef,'#')"/> 
<xsl:variable name="root" select="/plm:PLMXML/plm:ProductRevision[@id=$rprid]"/> 
<!-- Reference to the Site element and last name attribute -->  
<xsl:variable name="site" select="/plm:PLMXML/plm:Site"/> 
<xsl:variable name="site_name" select="$site/@name"/> 

<!-- The match attribute is used to associate a template with an XML element. 

     The match attribute can also be used to define a template for the entire XML document. 

     The value of the match attribute is an XPath expression (i.e. match="/" defines the whole document). 
--> 
<xsl:template match="/"> 

<!-- 

     HTML to define the structure and presentation of the output report to be published  

--> 
<html> 
<head> 
    <title>Global Teamcenter - Employee Information</title> 


<!-- 
     Calling the createCL template , passing parameter occStr as trvrootref variable 
--> 
    <xsl:call-template name="createCL"> 
     <xsl:with-param name="occStr" select="$trvrootref"/> 
    </xsl:call-template> 
    </table> 
</div> 
<br/> 
</body> 
</html> 

</xsl:template> 


<!-- Defining createCL template --> 
<xsl:template name="createCL"> 
<xsl:param name="occStr"/> 
    <xsl:if test="$occStr!=''"> 
    <xsl:choose> 
     <xsl:when test="contains($occStr,' ')"> 
      <xsl:variable name="occid" select="substring-before($occStr,' ')"/> 
      <xsl:variable name="newid" select="substring-after($occid,'#')"/> 
       <xsl:call-template name="createCL"> 
       <xsl:with-param name="occStr" select="$newid"/> 
       </xsl:call-template> 
       <xsl:call-template name="createCL"> 
       <xsl:with-param name="occStr" select="substring-after($occStr,' ')"/> 
       </xsl:call-template> 
     </xsl:when> 
<!-- inside createCL otherwise occStr <xsl:value-of select="$occStr"/> -->  
     <xsl:otherwise> 
     <xsl:choose> 
     <xsl:when test="contains($occStr,'#')"> 
      <xsl:variable name="newid" select="substring-after($occStr,'#')"/> 
<!-- 
     Calling the creCLext template , passing parameter occid as newid variable 
--> 
       <xsl:call-template name="creCLext"> 
       <xsl:with-param name="occid" select="$newid"/> 
      </xsl:call-template>     
     </xsl:when> 
      <xsl:otherwise> 
<!-- 
     Calling the creCLext template , passing parameter occid as occStr variable 
--> 
       <xsl:call-template name="creCLext"> 
        <xsl:with-param name="occid" select="$occStr"/> 
       </xsl:call-template> 
      </xsl:otherwise> 
     </xsl:choose> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:if> 
</xsl:template> 

<!-- Defining creCLext template --> 
<xsl:template name="creCLext"> 
<xsl:param name="occid"/> 

<!-- Reference to the user element and user_id,status and license_level attribute --> 

    <xsl:variable name="user" select="/plm:PLMXML/plm:User[@id=$occid]"/> 
    <xsl:variable name="per_ref" select="substring-after($user/@personRef,'#')" /> 
    <xsl:variable name="user_id" select="$user/@userId" /> 
    <xsl:variable name="license_level" select="$user/plm:UserData/plm:UserValue[3]/@value"/> 
    <xsl:variable name="last_login_time" select="$user/plm:UserData/plm:UserValue[4]/@value"/> 

<!-- Reference to the person element and last name attribute --> 

    <xsl:variable name="person" select="/plm:PLMXML/plm:Person[@id=$per_ref]"/>   
    <xsl:variable name="person_l" select="$person/@lastName"/> 


    <!-- Displaying the values by row order --> 
     <tr> 
     <td> 
     <xsl:value-of select="$person_l"/></td> 
     <td><xsl:value-of select="$user_id"/></td> 
     <td><xsl:choose> 
       <xsl:when test="$license_level=0">Author</xsl:when> <!-- Converting the output to string value --> 
       <xsl:otherwise>Consumer</xsl:otherwise> 
      </xsl:choose> 
     </td> 
     <td><xsl:value-of select="$last_login_time"/></td> 
     </tr>   
</xsl:template> 
</xsl:stylesheet> 
+0

Основная проблема этого кода заключается в том, что он не использует неназванные шаблоны и, соответственно, '' - описанная «проблема» является очень простой, когда при правильном использовании шаблонов, не требует даже сортировки. Я настоятельно рекомендую вам прочитать хорошую книгу о XSLT и XPath и по крайней мере понять основные моменты, прежде чем начинать писать любую XSLT-трансформацию. XSLT не похож на C или Java, или на C# или на любой язык, который вы использовали до сих пор - для этого требуется «сдвиг парадигмы», и вы, очевидно, не прошли эту точку. –

+0

Спасибо @DimitreNovatchev, Yeh Я новичок в XSLT и просто отвечаю требованиям небольшой трансформации. Я почти закончил с этим, и мне нужно разобраться, пока не отобразится. Можно ли отсортировать элементы так, как они есть, не претерпевая серьезных изменений в коде xslt? – kanwarpal

ответ

0

Посмотрите xsl:sort. Вот довольно хорошо example как его использовать.

+0

Спасибо @werner, но я уже прочитал его, он утверждает, что мы всегда можем использовать сортировку всегда в или . Где я хочу сортировать внутри kanwarpal

+0

Без просмотра вашего источника XML это трудно объяснить, куда должен идти сортировка. Где-то в вашем исходном документе будет набор элементов, которые вы хотите отсортировать. Где-то в вашей таблице стилей будут xsl: for-each или xsl: apply-templates, которые обрабатывают набор элементов. Это xsl: for-each или xsl: apply-templates - это то, где нужно сортировать xsl: sort. –

+0

@michealkay, я приложил код xslt выше. Шаблоны xsl: for-each и xsl: apply-templates не используются, поскольку функция вызывается повторно. Могу ли я сортировать файл license_status по мере его отображения? – kanwarpal

Смежные вопросы