使用XSLT进行xml转换,在内部节点中按字母顺序排序

时间:2012-05-25 12:58:35

标签: xslt

我有下一个WSDL文件

    <definitions targetNamespace="http://soft.com/" name="LoggingWebService" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://ws.config.softid.softcomputer.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
      <types>
        <xsd:schema>
          <xsd:import namespace="http://soft.com/" schemaLocation="my.xsd"/>
        </xsd:schema>
      </types>
      <message name="log">
        <part name="parameters" element="tns:log"/>
      </message>
      <message name="getLogs">
        <part name="parameters" element="tns:getLogs"/>
      </message>
   <portType name="LoggingWebService">
       <operation name="log">
           <input message="tns:log"/>
       </operation>
       <operation name="getLogs">
           <input message="tns:getLogs"/>
           <output message="tns:getLogsResponse"/>
      </operation>
  </portType>
</definitions>  

我希望使用javax.transformation将此文件转换为另一个文件,其中messages将按字母顺序排序(使用'name'中的字符串)。

<definitions targetNamespace="http://soft.com/" name="LoggingWebService" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://ws.config.softid.softcomputer.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
  <types>
    <xsd:schema>
      <xsd:import namespace="http://soft.com/" schemaLocation="my.xsd"/>
    </xsd:schema>
  </types>
  <message name="getLogs">
    <part name="parameters" element="tns:getLogs"/>
  </message>
    <message name="log">
    <part name="parameters" element="tns:log"/>
  </message>
   <portType name="LoggingWebService">
       <operation name="getLogs">
            <input message="tns:getLogs"/>
            <output message="tns:getLogsResponse"/>
       </operation>
       <operation name="log">
           <input message="tns:log"/>
       </operation>

   </portType>

</definitions>  

我需要什么XSLT文件?帮帮我PLZ

1 个答案:

答案 0 :(得分:1)

此样式表也适用于上一个问题中的文件。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    version="1.0" >

  <xsl:output method="xml" indent="yes" />
  <xsl:strip-space elements="*"/> 

  <xsl:template match="/wsdl:definitions" >

    <xsl:copy>

      <xsl:copy-of select="wsdl:types" />

      <xsl:apply-templates select="wsdl:message" >
        <xsl:sort select="@name" />
      </xsl:apply-templates>

      <xsl:apply-templates select="wsdl:portType" />

    </xsl:copy>

  </xsl:template>

  <xsl:template match="wsdl:message">
    <xsl:copy-of select="current()"/>
  </xsl:template>

  <xsl:template match="wsdl:portType">
    <xsl:copy>
      <xsl:apply-templates select="wsdl:operation">
        <xsl:sort select="@name"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="wsdl:operation">
    <xsl:copy-of select="current()"/>
  </xsl:template>

</xsl:stylesheet>

<强>输出

<?xml version="1.0" encoding="utf-8"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/">
   <types>
      <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
         <xsd:import namespace="http://soft.com/" schemaLocation="my.xsd"/>
      </xsd:schema>
   </types>
   <message name="getLogs">
      <part element="tns:getLogs" name="parameters"/>
   </message>
   <message name="log">
      <part element="tns:log" name="parameters"/>
   </message>
   <portType>
      <operation name="getLogs">
         <input message="tns:getLogs"/>
         <output message="tns:getLogsResponse"/>
      </operation>
      <operation name="log">
         <input message="tns:log"/>
      </operation>
   </portType>
</definitions>