新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论XSL,XSLT,XSL-FO,CSS等技术
    [返回] 中文XML论坛 - 专业的XML技术讨论区XML.ORG.CN讨论区 - XML技术『 XSL/XSLT/XSL-FO/CSS 』 → 【转】通过XSLT访问Java代码 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 2977 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 【转】通过XSLT访问Java代码 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     blackeyed524 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(猛啃高等数学)
      文章:32
      积分:151
      门派:XML.ORG.CN
      注册:2007/12/5

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给blackeyed524发送一个短消息 把blackeyed524加入好友 查看blackeyed524的个人资料 搜索blackeyed524在『 XSL/XSLT/XSL-FO/CSS 』的所有贴子 引用回复这个贴子 回复这个贴子 查看blackeyed524的博客楼主
    发贴心情 【转】通过XSLT访问Java代码

    假如你希望将XML数据转换为固定宽度和纯文本的字符串——这刚好是XSLT不太方便实现的一个特性,或者,也许你希望在XML文件中执行词语替换。在这些情况下,当你的事务超出了XSLT自身的处理能力时,可以通过在你的XSLT处理器中调用Java函数来完成。

      我看到过利用类似VBScript和Jscript的脚本语言完成特殊处理的例子(针对微软解析器的),但是如何利用Java来执行特殊的处理还不是特别地明显。尽管如此,简单地说,可以在XSLT处理器中通过XML命名空间(namespaces)调用Java函数来实现。Java与XSLT的结合为构建健壮的应用程序提供了强有力的方法。

      使用定制的命名空间

      命名空间是通过使用统一资源标识符(URI)来修饰限定XSL中元素和属性名称的一种方法。例如,常见的XSL元素需要有xsl命名空间前缀来修饰,xsl通过使用XSLT命名空间URI来声明:

    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

      但是并不局限于使用XSLT命名空间,你完全可以自由地声明你自己定制的命名空间,并用它们来识别定制的XSLT标签和范围。

      你必须使用定制的命名空间前缀来完成对外部函数的调用,例如,mynspace:fundtion(),该命名空间前缀mynspace,必须与一个命名空间URI相关联,例如:

    xmlns:myspace="d:///XMLprogs/mynamespace"

      一般的Java绑定使用命名空间URI标识Java类函数的位置。对用于本文示例代码的Xalan XSLT处理器(版本1.2.2)来说,命名空间URI必须具有URI-stem/packagename的形式。如果你使用了XT,那么你的命名空间应该有如下格式:

    xmlns:mynspace="d://XMLprogs/mynamespace.myclassname

    这种情况下,你可以使用XSLT代码调用来自myclassname的Java函数。

      绑定外部Java函数

      此处给出在XSLT模板内部绑定Java语言编写的外部函数的过程。

      将你自己定制的命名空间作为它们的属性添加到样式表(stylesheet)元素或者你的模板中。

      确保你的Java类文件所在目录位于你的XSLT处理器所运行的Java虚拟机(JVM)的CLASSPATH中。

      对于静态方法,可以使可以用完全合格的类名称加上方法和任何必需的的参数,当然还有命名空间前缀。

      对于非静态方法,首先创建类实例,然后调用该方法并提供任何必需的参数。

      例如,下面的样式表元素包含一个定制的命名空间声明:

    <?xml version=”1.0” encoding=”UTF-8”?>
    <xsl:stylesheet version=”1.0” xmlns:xsl=”http://www.w3.org/1999/XSL/Transform” xmlns:myspace=”d://XMLprogs/mynamespace”>

      在声明了这个命名空间后,可以访问该类的任何静态方法,像这样:

    <xsl:variable name=”funvalue”select=”mynspace:classname.function()”/>

      如果方法不是静态的,那么必须首先调用类构造器,例如:

    <xsl:variable name="funvalue" select="mynspace.classname.new()"/>
      <?xml version="1.0" encoding="UTF-8"?>
      <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:java="d://XMLprogs/mynamespace" exclude-result-prefixes="java">

    Java包"mynamespace"必须位于"d://XMLprogs"目录中。

      注意:使用可选属性xsl:exclude-result-prefixes,预防了java命名空间被包括到结果文档中。

    <xsl:template match="/">
    <html>
       <body>
         <p>
          <xsl:value-of select="java:DateClass.displayDate()"/>
         </p>
       </body>
    </html>
    </xsl:template>

      上面的XSLT代码中,<xsl:value-of select="java:DateClass.displayDate()"/>行调用位于mynamespace包中名为DateClass的类的静态方法displayDate()。

      利用这种技术,你可以调用任何Java类方法——包括那些需要参数的方法——参数来自于你的XSLT模板。

      本文涉及的代码:date.xsl

      <?xml version="1.0" encoding="UTF-8" ?>
    <xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform"xmlns:java="d://XMLprogs/mynamespace" exclude-result-prefixes="java">
    <xsl:template match="/">
    <html>
    <body>
    <p>
      <xsl:value-ofselect="java:DateClass.displayDate()" />
    </p>
    </body>
    </html>
    </xsl:template>
    </xsl:stylesheet>

      DateClass.java

    packagemynamespace;
    importjava.util.Date;
    public class DateClass{
       public static String displayDate(){
          Date d = new Date();
          returnd.toString();
       }
    }


      要运行这些代码,需要:

      创建文件夹"d:XMLProgsmynamespace"。

      将DateClass.java文件放入上述路径并编译得到DateClass.class文件。

      将"d:XMLProgsmynamespace"放入classpath变量中。

      利用XSLT处理器,例如XT或XALAN将该XSL文件和具体的XML文件关联。


       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/12/27 15:19:00
     
     enyaxp 帅哥哟,离线,有人找我吗?巨蟹座1984-7-4
      
      
      威望:2
      等级:计算机学士学位(版主)
      文章:350
      积分:2433
      门派:XML.ORG.CN
      注册:2007/12/11

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给enyaxp发送一个短消息 把enyaxp加入好友 查看enyaxp的个人资料 搜索enyaxp在『 XSL/XSLT/XSL-FO/CSS 』的所有贴子 点击这里发送电邮给enyaxp  引用回复这个贴子 回复这个贴子 查看enyaxp的博客2
    发贴心情 
    感觉还是用js实现比较方便

    ----------------------------------------------

    I'M BACK, NEVER GO AWAY.

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/12/27 16:22:00
     
     GoogleAdSense巨蟹座1984-7-4
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 XSL/XSLT/XSL-FO/CSS 』的所有贴子 点击这里发送电邮给Google AdSense  访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/5/14 3:34:07

    本主题贴数2,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    1,914.063ms