XSL:转换从哪里开始?

用XSL把XML的数据转换成完美的多列表格形式 摘要:本文通过实际的例子来说明如何在XSL中实现对XML数据转换成完美的多列表格。在利用XSL对XML进行转换时,有时候需要把XML转换成多列的Table元素,这个问题经常会困扰许多人,如果不生成Table的话,只需要对循环中的节点进行位置取模后判断,然后用换行即可。但有时候为了用户需要和界面的美观,需要生成多行多列的Table,常用的方法是采用following-sibling进行判断,比如下面 阅读详情

XSL:转换从哪里开始?
前言
爱好XML的人最终会试着将转换XML为HTML,或者转换为其他类型的文档,DOM/SAX显然不是专门为转换设计的,CSS对于转换也是力有不逮,所以XML的爱好者们几乎无一例外的要遭遇XSL,但是XSL似乎有非常多的用法,对于XML仅仅只是表示格式化的数据而言,XSL显得复杂且毫无头绪。

例如《跟我学XSL》和《XSL基础入门》这样的教程会带给你XSL的一些概念和例子,但是对于XSL的运行环境、平台特性和本质,似乎都语焉不详,你最终学会的仅仅是在XMLSPY或者IE中打开你的XML看看它转换后的效果罢了。一有人提到脚本语言或者JAVA中调用XSL你就头大了,甚至你不清楚XSL和XSLT究竟有什么区别。迷失在网络中的人们喜欢不停的用google搜索你想要的中文资料,但是其实有那个时间,干脆去那种技术的官方网站上好好看看吧。http://www.w3.org/Style/XSL/是XSL技术的W3C的官方网站,在网页正文的第一行它就解释和XSL和XSLT的区别。原文如下:

XSL is a family of recommendations for defining XML document transformation and presentation. It consists of three parts:

XSL Transformations (XSLT) 

a language for transforming XML 

the XML Path Language (XPath) 

an expression language used by XSLT to access or refer to parts of an XML document. (XPath is also used by the XML Linking specification) 

XSL Formatting Objects (XSL-FO) 

an XML vocabulary for specifying formatting semantics 

XSL是一组定义XML文档的转换和显示特征的推荐标准,它包括三个部分:XSL转换(XSLT)是一种为了转换XML而定义的语言;XML路径语言(XPath)是一种表达式语言,它被XSLT用来访问或者提交一个XML文档的某些部分(XPath也同时被XML Linking标准使用);XSL格式化对象(XSL-FO)是一个XML词汇表用来定义XML的格式化语义。

从何开始
一般人学习XSL都是从XMLSPY等工具开始运行他的一个XSL例子,当然用文本编辑器编辑XML何XSL文件,用IE去打开XML也是一个好主意。因为XMLSPY和IE都有嵌入式的XSL解析器,例如IE的XSL解析器是MSXML,这样不用显式的调用XSL进行转换过程,只需要在XML文档的头部加上一句<?xml:stylesheet type="text/xsl" href="xxx.xsl"?>就可以让嵌入的XSL解析器自动的进行转换了。例如下面这个著名的例子,它包括cd_catalog.xml和cd_catalog.xsl文件,内容如下:

xml文件:

<?xml version="1.0" encoding="GB2312"?>

<?xml:stylesheet type="text/xsl" href="cd_catalog.xsl"?>

<CATALOG>

   <CD>

       <TITLE>Empire Burlesque</TITLE>

       <ARTIST>Bob Dylan</ARTIST>

       <COUNTRY>USA</COUNTRY>

       <COMPANY>Columbia</COMPANY>

       <PRICE>10.90</PRICE>

       <YEAR>1985</YEAR>

   </CD>

   <CD>

       <TITLE>喀什噶尔胡杨</TITLE>

       <ARTIST>刀郎</ARTIST>

       <COUNTRY>China</COUNTRY>

       <COMPANY>先之唱片</COMPANY>

       <PRICE>20.60</PRICE>

       <YEAR>2004</YEAR>

   </CD>

   <CD>

       <TITLE>敦煌(特别版)</TITLE>

       <ARTIST>女子十二乐坊</ARTIST>

       <COUNTRY>China</COUNTRY>

       <COMPANY>百代唱片</COMPANY>

       <PRICE>25.60</PRICE>

       <YEAR>2005</YEAR>

   </CD>

</CATALOG>

 

xsl文件:

<?xml version="1.0" encoding="GB2312"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">

   <xsl:template match="/">

       <html>

          <body>

             <table border="2" bgcolor="yellow">

                 <tr>

                    <th>Title</th>

                    <th>Artist</th>

                 </tr>

                 <xsl:for-each select="CATALOG/CD">

                    <tr>

                        <td>

                           <xsl:value-of select="TITLE"/>

                       </td>

                       <td>

                           <xsl:value-of select="ARTIST"/>

                       </td>

                    </tr>

                 </xsl:for-each>

             </table>

          </body>

       </html>

   </xsl:template>

</xsl:stylesheet>

将它们保存在同一目录下然后用IE5以上版本的IE直接打开xml文件,则会看到转换后的效果。当然用XMLSPY中自带的浏览器也可。

用JScript显式调用XSL解析器
上面的运行方法显然是“贪天之功”,利用了IE和XMLSPY自带的XSL解析器,是让一只看不见的手运行了转换过程。那么,也可以用Jscript语言显式的调用XSL解析器,让没有嵌入解析器的浏览器也可以运行XSL,当然,此浏览器必须支持Jscript脚本语言。我们还是使用上面的例子,不过将cd_catalog.xml中的<?xml:stylesheet type="text/xsl" href="cd_catalog.xsl"?>这一行去掉,同时新建一个cd_catalog.html文档,内容如下:

   <html>

    <body>

    <script language="javascript">

    // Load XML

    var xml = new ActiveXObject("Microsoft.XMLDOM")

    xml.async = false

    xml.load("cd_catalog.xml")

    // Load the XSL

    var xsl = new ActiveXObject("Microsoft.XMLDOM")

    xsl.async = false

    xsl.load("cd_catalog.xsl")

    // Transform

    document.write(xml.transformNode(xsl))

    </script>

    </body>

</html>

将此html文档在支持Jscript的浏览器中打开,即可看到如前一段执行的结果。当然不仅仅是Jscript,其他的脚本语言如VBScript等等也可以,不过Jscript是XSL默认的脚本语言。

脚本扩充的XSL,令人疑惑的xsl:eval标记
    xsl:eval标记并不是一个标准的xsl标记,它属于http://www.w3.org/TR/WD-xsl这个名字空间,这个名字空间最终被微软采用,于是xsl:eval也被微软用来调用Jscript脚本,以此来扩充XSL的功能。而标准的XSL1.0版本的名字空间是http://www.w3.org/1999/XSL/Transform,它并不包含xsl:eval标记,这是很容易理解的,XSL应该属于一个平台无关的技术,如果它的某个标记要依赖微软公司的产品,那显然是自掘坟墓。关于平台无关的讨论,将在本文的最后展开。

    xsl:eval标记的含义是计算其中脚本语言的表达式,并作为文本输出。下面的例子中计算了cd_catalog.xml中各种CD的总价格,修改上面的cd_catalog.xsl并另存为cd_catalog2.xsl文件如下:

<?xml version="1.0" encoding="GB2312"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/TR/WD-xsl">

   <xsl:template match="/">

       <html>

          <body>

             <table border="2" bgcolor="yellow">

                 <tr>

                    <th>Title</th>

                    <th>Artist</th>

                 </tr>

                 <xsl:for-each select="CATALOG/CD">

                    <tr>

                       <td>

                           <xsl:value-of select="TITLE"/>

                       </td>

                       <td>

                           <xsl:value-of select="ARTIST"/>

                       </td>

                    </tr>

                 </xsl:for-each>

                 <tr>

                    <td>合计</td>

                    <td>

                       <xsl:eval>total("PRICE")</xsl:eval>

                    </td>

                    <xsl:script> 

                       function total(q){ 

                            temp=0; 

                            mark='/CATALOG/CD/'+q; 

                            v=selectNodes(mark); 

                            for(t=v.nextNode();t;t=v.nextNode()){ 

                                 temp+=Number(t.text);

                            } 

                            return temp;

                      } 

                    </xsl:script>

                 </tr>

             </table>

          </body>

       </html>

   </xsl:template>

</xsl:stylesheet>

在IE中打开cd_catalog.xml文件(注意修改xsl为cd_catalog2.xsl)即可看到结果,注意这个xsl文件的这一行<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/TR/WD-xsl">,写错了名字空间xsl:eval标记就会报错。

浏览器无关的XSL解决方案,服务端的XSL
不管如何折腾,要将XML通过XSL转换为HTML必须要求本地主机上有一个XSL解析器,不管是浏览器内嵌的,还是可以通过脚本语言调用。那么,更好的解决方案当然是从服务器端直接发送HTML回来,这样无论什么浏览器都可以看到转换的结果了。ASP提供了这个功能,这是可想而知的,不过我对ASP不熟,这段略过,有兴趣的可以找本ASP的XML教材看看。

应用程序中的XSL,语言相关的XSL
众所周知,Java是对XML技术支持得最好的语言,Java上面的xml包非常多,其中支持XSL转换的包最著名的有Saxon和xalan。Saxon包可以在http://saxon.sourceforge.net/上面下载。将Saxon包解压缩到C:/saxon6_5_3,6.5.3版本提供了对XSL1.0最稳定的支持。然后在Classpath中加入C:/saxon6_5_3/saxon.jar;C:/saxon6_5_3/saxon-jdom.jar。

Saxon提供命令行式的XSL转换和API。其中命令行式的转换如下,将目录移动到存放xml(去掉xml的指定xsl的那一行)和xsl的目录,然后输入下面的命令:

java com.icl.saxon.StyleSheet cd_catalog.xml cd_catalog.xsl

就可以看到输出在屏幕上的结果,但是这样看起来不方便,所以输入如下命令:

java com.icl.saxon.StyleSheet cd_catalog.xml cd_catalog.xsl>a.html

然后将生成的a.html在浏览器中打开,可以清晰的看到结果。

下面是在Java程序中调用Saxon包,进行XSL转换的例子,文件名为XslExam.java:

import java.io.File;

import javax.xml.transform.Result;

import javax.xml.transform.Source;

import javax.xml.transform.Templates;

import javax.xml.transform.Transformer;

import javax.xml.transform.TransformerConfigurationException;

import javax.xml.transform.TransformerException;

import javax.xml.transform.sax.SAXSource;

import javax.xml.transform.stream.StreamResult;

import com.icl.saxon.ExtendedInputSource;

import com.icl.saxon.TransformerFactoryImpl;

 

public class XSLExam {

      public static void main(String[] args) {

        String sourceFileName = "cd_catalog.xml";

        String styleFileName = "cd_catalog.xsl";

        String outputFileName = "result.html";

        File sourceFile = null;

        File styleFile = null;

        File outputFile = null;

        

        TransformerFactoryImpl factory = new TransformerFactoryImpl();

        

        Source sourceInput = null;

        sourceFile = new File(sourceFileName);

        ExtendedInputSource eis = new ExtendedInputSource(sourceFile);

        sourceInput = new SAXSource(factory.getSourceParser(), eis);

        eis.setEstimatedLength((int)sourceFile.length());

        

        Source styleSource ;

        File sheetFile = new File(styleFileName);

        eis = new ExtendedInputSource(sheetFile);

        styleSource = new SAXSource(factory.getStyleParser(), eis);

        

        outputFile=new File(outputFileName);

        

             try {

                     Templates sheet = factory.newTemplates(styleSource);

                     Transformer instance = sheet.newTransformer();

               Result result = new StreamResult(outputFile);

               instance.transform(sourceInput, result);

               

              } catch (TransformerConfigurationException e) {

                     e.printStackTrace();

              }catch (TransformerException err) {

                     err.printStackTrace();

        }

       }

}

这个例子程序将cd_catalog.xml文件使用cd_catalog.xsl转换为result.html。在Eclipse3.01中调试通过(Saxon没有简单的xsl示例程序,我也是将com.icl.saxon.StyleSheet类拔光了才得到这个稍微简单的例子,如果需要更详细的用法,参考com.icl.saxon.StyleSheet类)。

数据是独立的,处理是平台相关的
    总结前面的内容,可以看出XSL转换可以从这几个地方开始:

&Oslash;         IE,XMLSPY:嵌入的解析器,例如MSXML3;

&Oslash;         JScript,显式调用XSL解析器;

&Oslash;         用JScript扩充XSL功能,半吊子的XSL;

&Oslash;         浏览器无关的XSL解决方案,服务器端的XSL,ASP显式调用XSL;

&Oslash;         语言相关的XSL,Java的XSL包Saxon,xalan。

可以看出来,XSL无论如何,都是要平台相关的,第一种方法依赖嵌入浏览器的XSL解析器;第二、三种方法依赖操作系统安装的XSL解析器;第四种方法依赖服务器端安装的XSL解析器;最后的方法依赖JAVA语言提供的XSL API。其中微软还不顾W3C的反对,自定义了XSL的脚本扩充功能,功能倒是强大了,可惜脱离了Windows就玩不转了。JAVA号称平台无关,可是JAVA本身就是一个平台,要是有人的机器没有JRE又怎么办呢?丢弃XSL?

不过事物总是有因果的,其实XML作为数据的存储载体,可以做到完全的平台无关,但是XSL作为一个可执行的语言,一定要依赖某种已存在的运行环境的,就如同数据库中的表格和SQL语言一样。SQL号称适用于任何关系数据库,但是实际上还是需要一个环境来run的。那么XSL是否破坏了XML的平台无关性呢?我认为没有,因为XSL本身是一个XML文档,XML文档可以平台无关的保存和传输,至于使用何种方法来调用它则是另外考虑的问题。再者,XSL的源和目标都是平台无关的文档(例如XML和HTML),而它自己的调用方式则是可替换的,这点也减轻了XSL的负罪感吧。

以上的讨论都是基于XSL1.0标准的,目前XSL2.0标准尚在讨论中,不过初稿已经发布了,而Saxon8.0以上的版本号称已经支持了XSL2.0。让我们拭目以待XSL2.0带给我们的惊喜。

参考文献
W3C站点:http://www.w3.org/Style/XSL/

XSL主题:http://www-900.ibm.com/developerWorks/cn/xml/theme/x-xsl.shtml

中文译文站点:http://www.opendl.com/

XSLT是什么类型的语言,SAXON的作者谈XSL:http://www-900.ibm.com/developerWorks/cn/xml/x-xslt/index.shtml

 
XSL 语言 XSL是一种强大的工具,用于处理和呈现XML数据。XSLT用于将XML文档转换为其他格式,XPath用于在XML文档中定位元素,而XSL-FO用于格式化XML数据。了解和掌握XSL的这三个部分,将有助于更好地处理和呈现XML数据。 阅读详情

相关推荐

18、XSLT 转换:从基础到高级应用

本文详细介绍了XSLT转换的基础知识和高级应用,包括`xsl:choose`元素的使用、将不同格式的XML订单转换为统一格式的后端转换实践,以及通过多模板XSLT样式表处理层次化数据并生成HTML输出的高级转换技巧。适用于需要高效处理和展示XML数据的场景。

xgboost6farmer的博客 73

伪元素选择器注意事项

before 和 after 必须有 content 属性 before 在内容前面,after 在内容后面 before 和 after 创建的是一个元素,但是属于行内元素 创建出来的元素在 Dom 中查找不到,所以称为伪元素 伪元素和标签选择器一样,权重为 1 ...

MR_JIABing的博客 286

深入理解XSL转换在XML数据展示中的应用

本文深入探讨了XSL转换在XML数据展示中的应用,包括XSL的基本概念、如何通过XSL格式化原始XML数据,以及如何在Access中导出带有XSL转换的XML文档。文章通过实际操作演示了如何创建和应用XSL文件来定义数据的展示方式,包括元素顺序的改变和选择性处理。此外,还介绍了XSL中的模板使用、XSLT格式化指令以及如何将数据转换为HTML格式,最后探讨了XPath查询语言在XSL转换中的重要性。

weixin_36047538的博客 471

XML—— XSL 转换

【0】README0.1) 本文文字描述转自 core java volume 2 , 旨在理解 XML—— XSL 转换 的基础知识 ; 0.2)XSL 转换: XSL 转换(eXtensible StyleSheet Language==扩展样式表语言) (for detailed XSLT, please visit http://blog.youkuaiyun.com/pacosonswjtu

PacosonSWJTU的博客 2095

XSL转换技术:XML到EXCEL的导出指南

XSL转换主要基于模板匹配的原则,通过定义一系列的规则来指导如何将XML文档中的元素转换成特定格式的输出,例如HTML、PDF或本章节的重点Excel。整个转换过程包括解析XML源文件,应用XSL样式表,并生成目标格式文件。可扩展样式表语言转换(XSLT)是一种用于转换XML文档的语言,它定义了如何将一个XML文档转换成另一个文档。XSLT的工作原理是通过定义一系列的模板规则(template rules),这些规则指定了如何在输出文档中表示输入文档的元素和属性。

weixin_32480007的博客 884

OMML至MML转换的XSL实现指南

OMML与MML是专门为数学公式的显示和排版而设计的标记语言,它们在学术和技术文档中扮演着至关重要的角色。OMML主要应用于Microsoft Office套件中,特别是Word文档中,而MML则是在数学和科学文献的Web出版中广泛使用,如MathJax或LaTeX等格式。OMML是一种二进制的XML标记语言,它允许在Word文档中创建复杂的数学公式,为公式提供结构化信息,但其封闭性质使其在其他平台上的兼容性和可读性较差。

weixin_32311823的博客 1115

JavaEE XML XSL转换(XSLT)

XSL转换(XSLT) @author ixenos 定义: XSL转换机制可以指定将XML文档转换为其他格式的规则,例如,txt纯文本、XHTML或其他任何XML格式。 用途: XSLT通常用来将某种机器可读的XML格式转译为另一种机器可读的XML格式,或者将XML转译为适合人类阅读的表示格式 步骤: 1、 需要提供XSLT样式...

ddmm2012的博客 360

XML+XSL/FO生成PDF文件Demo

XML+XSL/FO生成PDF文件Demo,主要用于Fop插件,算是个小型练习项目

XSL对xml文件的转化

什么是 XSLT? XSLT 指 XSL 转换(XSL Transformations)。XSLT 是 XSL 中最重要的部分。XSLT 可将一种 XML 文档转换为另外一种 XML 文档。XSLT 使用 XPath 在 XML 文档中进行导航。XPath 是一个 W3C 标准。 XSLT = XSL 转换 XSLT 是 XSL 中最重要的部分。 XSLT 用于

不了了之之了之 1044

AG101:基于Java的可视XSL编辑器/调试器-开源

AG101是基于Java的可视XSL编辑器/调试器,建立在Pollo XML编辑器(

步进电机 cia402协议 报文自己的理解 (笔记)

步进电机 cia402协议 报文自己的理解 (笔记)

she666666的博客 3802

通过XSL转换XML文件

    最近,开始学习了XML编程,慢慢的喜欢赏了它。    XML文件只注重对数据与文件格式的描述,但它还是不太适合用来显示内容。用它作出来的东西看起来并不是那么美观,但还是可以找到补救的方法的。我们把显示方面的工作交给排版样式表。    排版样式表分:CSS和XSL。其中XSL非常适合XML。(在这里不着重讨论CSS!)        现在开始转换吧!        XSL包含

chaoyanglee163的专栏 2458

Android音频学习(八)——AudioFlinger线程

在 PlaybackThread 的实现中,Flag 用于标识线程的特殊行为或配置。

miemie2014的博客 1399

XSL简明教程(2)XSL转换

二.XSL的转换 1.将XML转换成HTMLXSL是如何将XML文档转换成HTML文件的呢?我们来看一个例子,下面是XML文档的一部分:Empire BurlesqueBob DylanUSAColumbia10.901985...然后我们将下面的XSL文件作为HTML的模板将XML数据转换为HTML文件:TitleArtist在上面的代码中, xsl:fo

善钧@程序员 775

在x86机器上运行jailhouse

jailhouse jaihouse提供了一个demo ,https://github.com/siemens/jailhouse-images可以用于编译一整套可用的demo。 适用于多个平台。编译过程主要参考https://blog.youkuaiyun.com/weixin_39541632/article/details/110422345 此demo可以生成多个平台所用的操作系统image。 ...

闲人的专栏 3004

借助生成式 AI 加快创作速度,通过快速构建 Omniverse 扩展程序,您可以直接在 USD Composer 中连接首选的生成式 AI 智能体并与之交互。或者,您也可以使用由 LLM 提供支持的

通过快速构建 Omniverse 扩展程序,您可以直接在 USD Composer 中连接首选的生成式 AI 智能体并与之交互。或者,您也可以使用由 LLM 提供支持的 OpenUSD 开发方法,为您的工作流程提供强劲助力。

pvmsmfchcs的博客 683

xml与xsl的转换

xml文档的一大特点是可以向多种格式的文档进行转换。比如,从一种逻辑结构的xml向另一种逻辑结构的xml转换,或是转换为可浏览的html文档等。这种xml文档的数据格式转换功能由可扩展样式单语言(xsl)完成。  -------------------------------------------------------------------------------- 一、xml文档转换原理 ...

越努力, 2358

YOLO11涨点优化:训练技巧 | 使用标签平滑(Label Smoothing)配合余弦退火学习率,防止过拟合,稳步提点

摘要: YOLO11凭借动态卷积核调度、自适应特征融合等创新成为2026年目标检测主流,但面临训练集过拟合问题。文章聚焦两种零推理开销的正则化技巧:标签平滑(Label Smoothing)和余弦退火学习率(Cosine Annealing LR)。标签平滑通过软化硬标签(如将[1,0]改为[0.9,0.1])防止模型过度自信,代码中通过label_smoothing=0.1一键启用;余弦退火则以平滑的余弦曲线调整学习率(cos_lr=True),避免阶梯衰减的震荡。两者组合可显著缩小YOLO11训练与验证

2601_95807009的博客 45

如何解决XSL转换XML的时候出现乱码的问题

XSL转换中文出现乱码的解决方案

kydkong的博客 4177

计算机网络基础:揭开网络世界的神秘面纱

计算机网络基础:揭开网络世界的神秘面纱,计算机网络已深度融入现代生活,这篇文章对其基础内容展开全面阐述。开篇介绍计算机网络的定义,说明其由计算机设备、网络设备和传输介质构成。接着从地域范围和拓扑结构两个维度对计算机网络进行分类,并详细讲解 OSI 和 TCP/IP 参考模型,明晰各层功能与联系。随后阐述网络通信协议的定义及常见协议,如 TCP/IP、HTTP 等。最后聚焦网络安全,涵盖定义、重要性以及防火墙、加密技术等常用安全技术。文章旨在帮助读者构建计算机网络基础知识体系,理解其在生活和工作中的应用与价值

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 6万+

Qt QCustomPlot 图形库详解及使用

QCustomPlot 是一个开源的 Qt C++ 库,专门用于创建数据图表。易于集成到 Qt 项目中。支持多种图表类型,如折线图、散点图、条形图等。提供丰富的交互功能,如缩放、平移、选择和拖动。高度可定制,支持图形的各种样式设置。// 添加第一条曲线i < 101;++i) {// 设置曲线颜色// 添加第二条曲线i < 101;++i) {// 设置曲线颜色// 设置散点样式// 添加图例。

MusicScore的博客 764
上一篇: XSL 简明教程 (下)
下一篇: 跟我学XSL
baobeiSimple
博客等级 码龄20年 61粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值