2013-05-26 73 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文件没有改变?我究竟做错了什么?我需要某种更新还是...? –

相关问题