XML - 如何在一个属性上对文件进行排序?

时间:2013-05-26 08:36:59

标签: xml sorting

我有XML(非常大的文件),我想根据属性(列)值contact_name的SORTING得到输出。这可能是使用某种工具还是编码?

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

2 个答案:

答案 0 :(得分:1)

在您的XSLT文件sms.xsl中,您可以<xsl:sort>使用@来引用属性,就像这样......

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

注意:定位很重要,需要在<xsl:for-each><xsl:apply-templates>之内。因此,只需在<xsl:for-each>文件中的sms.xsl开头后直接插入上述行...

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

答案 1 :(得分: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

其次你使用<xsl:sort select="contact_name" data-type="text"/> 在XML的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">
        <!-- 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>