如何用XSL对XML的数据进行按节点排序?

原创 2014年05月26日 23:32:04

今天工作当中,遇到一个问题,XML的Schema文件中定义的complexType是一个Sequence,这就要求符合这个Schema定义的XML的数据节点,必须要按照Schema中Sequence定义的顺序出现(etag-->id-->kind-->selfLink-->title-->updated),否则Schema校验将会出错。请见下图1和图2, 换句话说,在于XML的数据中节点的出现的顺序和必须和Schema中(节点的顺序是按照节点名字的字母升序排列)定义的顺序一致,否则Schema的校验是通不过的.

图1


图2


那么在这种情况,如何用最少的代码,同时又不引用任何除JDK外的第三方的jar包呢?

答案就是使用XSL技术(http://www.w3schools.com/xsl/) 把XML数据中的节点TaskList节点,按照节点的名字升序排列,这样的话,XML数据和Scheam定义的顺序

就能完全保持一致,Schema的校验就能完全通过。具体的XSL文件和Java代码清单如下,


1. XSL文件如下

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="@*">
<xsl:sort select="name()" />
</xsl:apply-templates>
<xsl:apply-templates select="node()">
<xsl:sort select="name()" />
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>



2.Java代码如下,


import javax.xml.transform.*;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
public class XSDSequenceElementsSorter {
public static void main(String[] args) {
String dataXML = "c:\test\tasklists_data.xml";
    String inputXSL = "c:\test\tasklists_data.xsl";
    String outputHTML ="c:\test\tasklists_data_sorted.xml";
try {
   TransformerFactory factory = TransformerFactory.newInstance();
       StreamSource xslStream = new StreamSource(inputXSL);
       Transformer transformer = factory.newTransformer(xslStream);
       StreamSource in = new StreamSource(dataXML);
       StreamResult out = new StreamResult(outputHTML);
       transformer.transform(in, out);
} catch (TransformerConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TransformerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

链表的冒泡排序(节点交换法)

链表冒泡排序,可以通过修改节点值和交换节点两种方法,下面给出交换节点的方法。 #include #include struct Node{ int data; Node *next; }; ...
  • u011739410
  • u011739410
  • 2015年05月10日 10:48
  • 2256

lua-把table中的元素按照key的ascii码升序排序并组装成key-value的xml格式

跟外部的接口对接,很多接口都是http-xml的形式。 而且要求要把table中的元素按照key的ascii码升序排序后再组装成key-value的xml格式。 比如有一个table,tbl tbl ...
  • terry7
  • terry7
  • 2015年08月05日 09:23
  • 1516

XML+xsl 追加节点后转HTML

package com.bill; import java.util.Date; import javax.xml.parsers.DocumentBuilder; import javax.x...
  • yangdayin
  • yangdayin
  • 2012年08月11日 22:02
  • 390

使用xslt将xml转化为xhtml的形似(下两种方法不要进行xsl文件的引用)

test.xml: Empire Burlesque Bob Dylan USA Columbia 10.90 1985 c...
  • Grit_ICPC
  • Grit_ICPC
  • 2017年05月18日 15:18
  • 426

tree型的json数据按照json的某个字段对子节点进行排序

项目中要求tree型的json数据按照json的某个字段对子节点进行排序,自己花时间写了写,整理如下: 要求:按照type属性对json数据进行排序,没有子节点(type=0)的排在前面 1.初始...
  • u010176097
  • u010176097
  • 2015年08月07日 15:37
  • 1407

根据xsl模板及xml数据文件生成pdf(文字内容复制不乱码)

使用FOP技术,配合xsl模板及XML数据生成PDF报表和线上打印业务
  • Angelahedl
  • Angelahedl
  • 2017年05月23日 15:33
  • 440

xsl-fo模板,pl/sql生成的xml数据源,R12输出PDF

xsl xslt xsl-fo xml publisher fop
  • erenjian
  • erenjian
  • 2011年05月30日 00:17
  • 455

java中通过xsl将xml数据装换为html格式字符串

直接给代码: package com.adam.xedit.service.server.xml; import java.io.ByteArrayInputStream; import java...
  • hu_shengyang
  • hu_shengyang
  • 2013年03月15日 17:42
  • 4640

处理:SqlServer FOR XML 无法对节点 'NoName' 的数据进行序列化,因为它包含在 XML 中不允许出现的字符(0x0000)。

处理:SqlServer FOR XML 无法对节点 'NoName' 的数据进行序列化,因为它包含在 XML 中不允许出现的字符(0x0000)。...
  • jzt_designer
  • jzt_designer
  • 2016年11月23日 19:22
  • 581

xml编程ppt数据岛ddt xsl dom jax xml编程 编程编程编程编程编程

  • 2010年06月30日 09:50
  • 4.21MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何用XSL对XML的数据进行按节点排序?
举报原因:
原因补充:

(最多只允许输入30个字)