2013-05-26 72 views
1

我有XML(非常大的文件),我想獲得輸出基於屬性(列)值contact_name的排序。這可能使用某種工具或編碼?XML - 如何對一個屬性上的文件進行排序?

<?xml version='1.0' encoding='UTF-8' standalone='yes' ?> 
<?xml-stylesheet type="text/xsl" href="sms.xsl"?> 
<smses count="4"> 

<sms address="+381642" subject="null" contact_name="C" /> 
<sms address="+3816424" subject="null" contact_name="A" /> 
<sms address="+3816427" subject="null" contact_name="B" /> 
</smses> 

sms.xsl文件

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
       xmlns:user="http://android.riteshsahu.com"> 
<xsl:template match="/"> 
    <html> 
     <head> 
      <style type="text/css"> 
      body 
      { 
      font-family:arial,sans-serif; 
      color:#000; 
      font-size:13px; 
      color:#333; 
      } 
      table 
      { 
      font-size:1em; 
      margin:0 0 1em; 
      border-collapse:collapse; 
      border-width:0; 
      empty-cells:show; 
      } 
      td,th 
      { 
      border:1px solid #ccc; 
      padding:6px 12px; 
      text-align:left; 
      vertical-align:top; 
      background-color:inherit; 
      } 
      th 
      { 
      background-color:#dee8f1; 
      } 
      </style> 
     </head> 
     <body> 
     <h2>SMS Messages</h2> 
     <table> 
     <tr> 
      <th>Type</th> 
      <th>Number</th> 
      <th>Contact</th> 
      <th>Date</th> 
      <th>Message</th> 
     </tr> 
     <xsl:for-each select="smses/sms"> 
     <xsl:sort select="contact_name" data-type="text"/> 
     <tr> 
      <td> 
      <xsl:if test="@type = 1"> 
      Received 
      </xsl:if> 
      <xsl:if test="@type = 2"> 
      Sent 
      </xsl:if> 
      </td> 
      <td><xsl:value-of select="@address"/></td> 
      <td><xsl:value-of select="@contact_name"/></td> 
      <td><xsl:value-of select="@date"/><br/><xsl:value-of select="@readable_date"/></td> 
      <td><xsl:value-of select="@body"/></td> 
     </tr> 
     </xsl:for-each> 
     </table> 
     </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 

回答

1

在XSLT文件,sms.xsl,則可以使用@引用一個屬性,這樣做的<xsl:sort> ...

<xsl:sort select="@contact_name"/> 

注意:定位很重要,它需要在<xsl:for-each><xsl:apply-templates>之內。因此,只要插入上述線路在sms.xsl文件<xsl:for-each>開始後直接...

<xsl:for-each select="smses/sms"> 
    <xsl:sort select="@contact_name"/> <!-- new line --> 
+0

請抱歉,但我從來沒有做過XSLT XML

的XSL文件

使用<xsl:sort select="contact_name" data-type="text"/> ..如何運行,在什麼樣的應用?請你能給我完整的描述。對此有所反駁,但真的不知道這件事...... –

+0

你的意思是在Java或..? –

+0

XML已經引用了一個XSLT文件:sms.xsl,所以這似乎是一個很好的排序方式。你可以發佈一些或全部的XSLT文件嗎? – davmos

0

這是XML

<xsl:sort select="expression" 
lang="language-code" 
data-type="text|number|qname" 
order="ascending|descending" 
case-order="upper-first|lower-first"/> 

排序在這之前,你需要知道XSTL語法格式化。見例如here

其次,你必須在最後這裏

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
       xmlns:user="http://android.riteshsahu.com"> 
<xsl:template match="/"> 
    <html> 
     <head> 
      <style type="text/css"> 
      body 
      { 
      font-family:arial,sans-serif; 
      color:#000; 
      font-size:13px; 
      color:#333; 
      } 
      table 
      { 
      font-size:1em; 
      margin:0 0 1em; 
      border-collapse:collapse; 
      border-width:0; 
      empty-cells:show; 
      } 
      td,th 
      { 
      border:1px solid #ccc; 
      padding:6px 12px; 
      text-align:left; 
      vertical-align:top; 
      background-color:inherit; 
      } 
      th 
      { 
      background-color:#dee8f1; 
      } 
      </style> 
     </head> 
     <body> 
     <h2>SMS Messages</h2> 
     <table> 
     <tr> 
      <th>Type</th> 
      <th>Number</th> 
      <th>Contact</th> 
      <th>Date</th> 
      <th>Message</th> 
     </tr> 
     <xsl:for-each select="smses/sms"> 
     <!-- Sorting added here --> 
     <xsl:sort select="contact_name" data-type="text"/>    
     <tr> 
      <td> 
      <xsl:if test="@type = 1"> 
      Received 
      </xsl:if> 
      <xsl:if test="@type = 2"> 
      Sent 
      </xsl:if> 
      </td> 
      <td><xsl:value-of select="@address"/></td> 
      <td><xsl:value-of select="@contact_name"/></td> 
      <td><xsl:value-of select="@date"/><br/><xsl:value-of select="@readable_date"/></td> 
      <td><xsl:value-of select="@body"/></td> 
     </tr> 
     </xsl:for-each> 
     </table> 
     </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 
+0

謝謝,但在哪裏把該代碼放在XSL文件?我用XSL文件更新了我的問題。請告訴我該把代碼放在哪裏?謝謝 –

+0

我已經在上面的代碼中添加了排序。只需使用它來生成XML。該字段的輸出將被排序。 – Yogus

+0

嗨,我用新的SMS.XSL文件更新了我的問題。我在XSL文件中輸入了新行。但是,當我重新打開XML文件沒有改變?我究竟做錯了什麼?我需要某種更新還是...? –

相關問題