XSLT2.0---多文件输出

本文介绍如何使用XSLT 2.0的<xsl:result-document>指令按属性分组输出XML文档到多个HTML文件的方法。文章通过具体实例展示了如何对XML源文档中的元素进行分组、排序及输出,并解决了在不同环境中解析XSLT文件可能出现的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<xsl:result-document>指令用于输出内容到文件。
XML源文档:
 <?xml version="1.0" encoding="GB2312"?>
   <root>
  <item f1="浙江" f2="绍兴" f3="aaa"/>
  <item f1="江苏" f2="苏州" f3="bbb"/>
  <item f1="浙江" f2="杭州" f3="ccc"/>
  <item f1="山东" f2="济南" f3="ddd"/>
  <item f1="山东" f2="青岛" f3="aaa"/>
  <item f1="江苏" f2="南京" f3="fff"/>
  <item f1="山东" f2="青岛" f3="ggg"/>
  <item f1="江苏" f2="南京" f3="hhh"/>
  <item f1="山东" f2="济南" f3="iii"/>
 </root>
XSLT文件:
 <?xml version='1.0'?>
<
xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<
xsl:output method="html" encoding="GB2312" name="output"/>
<
xsl:template match="/">
    <xsl:for-each-group select="root/item" group-by="@f1">
        <xsl:sort select="@f1"/>
        <xsl:variable name="filename" select="concat('province',position())"/>
        <xsl:result-document href="{$filename}.html" format="output">
             <xsl:value-of select="concat(@f1,'-')"/>
             <xsl:for-each-group select="current-group()" group-by="@f2">
               <xsl:sort select="@f2"/>
               <xsl:value-of select="concat(' ',@f2,':')"/>
               <xsl:for-each-group select="current-group()" group-by="@f3">
                 <xsl:sort select="@f3"/>
                 <xsl:value-of select="@f3"/>
                 <xsl:if test="position() != last()">,</xsl:if>
               </xsl:for-each-group>
            </xsl:for-each-group>
        </xsl:result-document>
    </xsl:for-each-group>
<
/xsl:template>
<
/xsl:stylesheet>
这里有几个问题需要注意的:
1,当用stylus studio 6.3的sax8.4来解析上面的XSLT文件时,出现错误:java.lang.RuntimeException:The System identifier of the principal output file is unkown.
错误的原因是,处理器不能很好的来解释XSLT2.0,并不是XSLT文件的语法问题。如果使用Stylus studio 2007的saxon8.7.3来解析,一切正常。
2,<xsl:result-document>的href属性要指定路径,那么相对路径跟哪个有关。实际的输出文件路径是相对当前XSLT文件的路径。
3,format属性指定输出的格式,该格式是上面预定义的:
<xsl:output method="html" encoding="GB2312" name="output"/>
如果没有指定输出编码为:GB2312,那输出的文件内容可能是乱码。
4,href="{$filename}.html"中的变量filename必须用大括号括起来。因为href属性的值是字符串,如果直接写成了href="$filename.html",则输出文件名为$filename.html。
这跟<xsl:value-of select="$filename">一类指令中的select属性不同,select属性就是用来指定节点集合(在XPATH2.0中理解为序列)或变量的。用大括号反而会出错。
5,如果href指定的文件名中含有汉字,则生成文件的文件名无法正常显示。这个问题留待解决。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值