如何在XSLT中对数据进行排序

时间:2014-08-25 10:36:27

标签: xml xslt xpath wso2 wso2esb

我正在使用wso2esb。 我希望使用wso2esb转换数据我已经完成了问题是在响应时我以递减的方式获取数据我将如何安排以升序方式。

 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Header>
       </soapenv:Header>
   <soapenv:Body>
      <open:employeeresponse xmlns:open="http://www.openuri.org/">
         <env:enve xmlns:env="http://eai.mc.rt/Envelope">
            <Domain xmlns="http://eai.mc.rt/Envelope" xmlns:mm="http://eai.rtk.rt/customer">mnh</Domain>
            <Service xmlns="http://eai.mc.rt/Envelope" xmlns:mm="http://eai.rtk.rt/customer">customer</Service>
            <Sender xmlns="http://eai.mc.rt/Envelope" xmlns:mm="http://eai.rtk.rt/customer">amng</Sender>
            <MessageId xmlns="http://eai.mc.rt/Envelope" xmlns:mm="http://eai.rtk.rt/customer">7001274870</MessageId>
            <Language xmlns="http://eai.mc.rt/Envelope" xmlns:mm="http://eai.rtk.rt/customer">En</Language>
            <UserId xmlns="http://eai.mc.rt/Envelope" xmlns:mm="http://eai.rtk.rt/customer">kmt</UserId>
            <env:Payload>
               <customer xmlns="http://eai.rtk.rt/customer" xmlns:ns2="http://www.openuri.org/">
                  <Response>
                     <Result_OutputData>
                        <resultCode>0</resultCode>
                        <reference_ID>23455</reference_ID>
                     </Result_OutputData>
                     <Output>
                        <mmount_No>1</mmount_No>
                        <mmount_Type>Business Individual</mmount_Type>
                        <Company_Name>AKA</Company_Name>
                        <codeid>556</codeid>
                        <Current_Status>AC</Current_Status>
                        <Status_Desc>ACTIVE</Status_Desc>
                        <Enhance_Data/>
                        <Enhance_Data_Fax/>
                        <Tariff_Plan_Code>GSM DIW</Tariff_Plan_Code>
                        <Tariff_Plan_Name>FARSI MOBILE DETAILS</Tariff_Plan_Name>
                        <COW_Date>2013-10-22+05:30</COW_Date>
                        <PUK1>12345678</PUK1>
                        <PUK2>2</PUK2>
                        <hj>0</hj>
                       </Output>
                     <mm:Output_Data xmlns:mm="http://eai.rtk.rt/customer">
                        <mm:empid>255</mm:empid>
                        <mm:amt>0</mm:amt>
                        <mm:date>Wed Sep 30 20:20:30 IST 2009</mm:date>
                        <mm:/>
                        <mm:Flag>false</mm:Flag>
                     </mm:Output_Data>
                     <mm:Output_Data xmlns:mm="http://eai.rtk.rt/customer">
                        <mm:empid>10</mm:empid>
                        <mm:amt>0</mm:amt>
                        <mm:date>Wed Sep 30 20:20:30 IST 2009</mm:date>
                        <mm:/>
                        <mm:Flag>true</mm:Flag>
                     </mm:Output_Data>
                     <mm:Output_Data xmlns:mm="http://eai.rtk.rt/customer">
                        <mm:empid>9</mm:empid>
                        <mm:amt>1000</mm:amt>
                        <mm:date>Wed Sep 30 20:20:30 IST 2009</mm:date>
                        <mm:/>
                        <mm:Flag>false</mm:Flag>
                     </mm:Output_Data>
                     <mm:Output_Data xmlns:mm="http://eai.rtk.rt/customer">
                        <mm:empid>8</mm:empid>
                        <mm:amt>0</mm:amt>
                        <mm:date>Wed Sep 30 20:20:30 IST 2009</mm:date>
                        <mm:/>
                        <mm:Flag>true</mm:Flag>
                     </mm:Output_Data>
                     <mm:Output_Data xmlns:mm="http://eai.rtk.rt/customer">
                        <mm:empid>7</mm:empid>
                        <mm:amt>200</mm:amt>
                        <mm:date>Wed Sep 30 20:20:30 IST 2009</mm:date>
                        <mm:/>
                        <mm:Flag>false</mm:Flag>
                     </mm:Output_Data>
                     <mm:Output_Data xmlns:mm="http://eai.rtk.rt/customer">
                        <mm:empid>6</mm:empid>
                        <mm:amt>100</mm:amt>
                        <mm:date>Wed Sep 30 20:20:30 IST 2009</mm:date>
                        <mm:/>
                        <mm:Flag>false</mm:Flag>
                     </mm:Output_Data>
                     <mm:Output_Data xmlns:mm="http://eai.rtk.rt/customer">
                        <mm:empid>5</mm:empid>
                        <mm:amt>1000</mm:amt>
                        <mm:date>Wed Sep 30 20:20:30 IST 2009</mm:date>
                        <mm:/>
                        <mm:Flag>false</mm:Flag>
                     </mm:Output_Data>
                     <mm:Output_Data xmlns:mm="http://eai.rtk.rt/customer">
                        <mm:empid>4</mm:empid>
                        <mm:amt>1000</mm:amt>
                        <mm:date>Wed Sep 30 20:20:30 IST 2009</mm:date>
                        <mm:/>
                        <mm:Flag>false</mm:Flag>
                     </mm:Output_Data>
                     <mm:Output_Data xmlns:mm="http://eai.rtk.rt/customer">
                        <mm:empid>3</mm:empid>
                        <mm:amt>1000</mm:amt>
                        <mm:date>Wed Sep 30 20:20:30 IST 2009</mm:date>
                        <mm:/>
                        <mm:Flag>false</mm:Flag>
                     </mm:Output_Data>
                     <mm:Output_Data xmlns:mm="http://eai.rtk.rt/customer">
                        <mm:empid>2</mm:empid>
                        <mm:amt>1000</mm:amt>
                        <mm:date>Wed Sep 30 20:20:30 IST 2009</mm:date>
                        <mm:/>
                        <mm:Flag>false</mm:Flag>
                     </mm:Output_Data>
                     <mm:Output_Data xmlns:mm="http://eai.rtk.rt/customer">
                        <mm:empid>1</mm:empid>
                        <mm:amt>1000</mm:amt>
                        <mm:date>Wed Sep 30 20:20:30 IST 2009</mm:date>
                        <mm:/>
                        <mm:Flag>false</mm:Flag>
                     </mm:Output_Data>
                               </Response>
               </customer>
            </env:Payload>
         </env:enve>
      </open:employeeresponse>
   </soapenv:Body>
</soapenv:Envelope>

我希望根据 mm:empid 按升序排列 mm:Output_Data 标记数据,那么我将如何安排我尝试使用xquery但我无法&#39 ;找到关于元素排序的任何函数,cusId应该出现在1,2,3,... 我试过这个XSLT 但没有错误,没有预期的反应

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:mm="http://eai.rtk.rt/customer" version="1.0">
    <xsl:output indent="yes"></xsl:output>
    <xsl:strip-space elements="*"></xsl:strip-space>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"></xsl:apply-templates>
        </xsl:copy>
    </xsl:template>
<xsl:template match="//mm:Response">
        <xsl:copy>
         <xsl:apply-templates select="//mm:Result_OutputData" />
            <xsl:apply-templates select="//mm:Output"/>
            <xsl:apply-templates select="//mm:Output_Data">
               <xsl:sort order="ascending" select="//mm:empid" data-type="number"/>
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>
   </xsl:stylesheet>

但它没有给出任何结果。 我怎么做到这一点,我知道在xpath中没有这个功能 提前谢谢。

1 个答案:

答案 0 :(得分:1)

你并不遥远,但问题主要在于这一行

<xsl:apply-templates select="//acc:Output_Data">

首先,您的XSLT中未定义名称空间前缀 acc ,这是一个错误。通过查看XML,您应该使用现有的 mm 前缀。

其次,通过使用/开始xpath表达式,这使得它成为绝对表达式,从顶级文档节点开始。使用//,您将在文档中选择所有Output_Data。排序表达式存在类似的问题。

简而言之,您的语句需要如下所示,以使用正确的命名空间,并使其相对于您当前所在的节点。

       <xsl:apply-templates select="mm:Output_Data">
          <xsl:sort order="ascending" select="mm:empid" data-type="number"/>
       </xsl:apply-templates>