编写定制 XPath 函数

可将某些种类的模型信息添加至报告(RPTDESIGN 文件)之前,必须编写定制 XPath 函数,才能抽取目标模型中的信息。

开始之前

先决条件:要完成此任务,必须熟悉 Eclipse 插件开发环境中的插件开发和 UML2 API。

过程

要编写定制 XPath 函数,请执行下列步骤:

  1. 创建新的插件项目:
    1. 在“插件开发”透视图中,单击文件 > 新建 > 其他,展开插件开发,选择插件项目,然后单击下一步
    2. 输入插件标识(例如 com.ibm.field.birt.xpath_extensions),然后单击下一步完成 这会将该插件添加至“包资源管理器”视图,并且有关该插件的信息会显示在“概述”页面上的“插件清单编辑器”视图中。
  2. 扩展 org.eclipse.jet.xpathFunctions 扩展点。
    1. 在“概述”页面上,单击扩展选项卡,然后单击添加
    2. 取消选中仅显示来自需要的插件的扩展点复选框。
    3. 扩展点过滤器字段中,输入 *.jet,然后在扩展列表中,双击 org.eclipse.jet.xpathFunctions
    4. 要确认希望将该插件添加至插件依赖项列表,请单击
    5. 单击 MANIFEST.MF 选项卡并将 org.eclipse.uml2.uml 添加至 Require_Bundle 列表,以便该插件对 UML API 具有可视性。 该列表的代码看起来应类似于以下内容:
      Require_Bundle: org.eclipse.ui,
        org.eclipse.core.runtime,
        org.eclipse.uml2.uml,
        org.eclipse.jet
    6. 单击 plugin.xml 选项卡并修改 <function> 定义以定义定制函数。 例如,如果定义名为 SlotValue 且具有两个自变量并在类 com.ibm.field.birt.xpath_extensions.SlotValue 中实现的函数,那么代码看起来将类似于以下内容:
      <function
           implementation="com.ibm.field.birt.xpath_extensions.SlotValues"
           maxArgs="2"
           minArgs="2"
           name="slotValue">
      </function>
    7. 单击文件 > 保存
  3. 创建代码 shell 并将它链接至插件:
    1. 在“包资源管理器”视图中,右键单击新的插件项目,然后单击新建 >
    2. 字段中,指定插件项目的名称。
    3. 名称字段中,输入该类的名称。 请使用与指定给新函数的名称相同的名称。例如,对于在步骤 2 中定义的函数,该名称将为 SlotValue
    4. 要添加接口,请单击添加
    5. 在“新建 Java 类”对话框的选择接口字段中,输入 XPathFunction,然后从匹配项的列表中,选择 XPathFunction - org.eclipse.jet.xpath 并依次单击确定完成
  4. 将代码添加至 XPath 函数的 Java™ 文件,以使它完成需要执行的任务,然后保存该文件。

    例如,如果要使函数 SlotValue 通过从第一个自变量(XPath 表达式)产生的节点进行迭代,并且要在它找到实例规范时返回插槽值(该插槽的 slotname 自变量通过调用 getStringValue 函数指定),那么您将编写以下代码:

    package com.ibm.field.birt.xpath_extensions;
    
    import java.util.Iterator;
    import java.util.List;
    
    import org.eclipse.jet.xpath.NodeSet;
    import org.eclipse.jet.xpath.XPathFunction;
    import org.eclipse.uml2.uml.InstanceSpecification;
    import org.eclipse.uml2.uml.Slot;
    import org.eclipse.uml2.uml.ValueSpecification;
    
    public class SlotValue implements XPathFunction {
    	
    	public String getStringValue(InstanceSpecification ia, String slotname) {
    		List slots = ia.getSlots();
    		for (Iterator iterator = slots.iterator(); iterator.hasNext();) {
    			Slot slot = (Slot) iterator.next();
    			String definingFeatureName = slot.getDefiningFeature().getName();			
    			if (definingFeatureName.equals(slotname)) {
    				List values = slot.getValues();
    				for (Iterator iterator2 = values.iterator(); iterator2
    sendData:function(){
    					ValueSpecification value = (ValueSpecification) iterator2.next();
    					return value.stringValue();
    				}
    			}
    		}
        return null;
    	}
    	
    	public Object evaluate(List args) {
    		Object obj = args.get(0);
    		String slotname = (String) args.get(1);
    		if (obj instanceof NodeSet) {
    			NodeSet ns = (NodeSet) obj;
    			for (Iterator iterator = ns.iterator(); iterator.hasNext();) {
    				Object item = (Object) iterator.next();
    				if (item instanceof InstanceSpecification){
    					InstanceSpecification ispec = (InstanceSpecification) item;
    					if ((slotname != null)&&(slotname.length()>0))
    						return getStringValue(ispec,slotname);
    				}
    			}
    		}
        return null;
    	}
    }
  5. 创建新的功能部件插件项目:
    1. 单击文件 > 新建 > 其他,展开插件开发,选择功能部件项目并单击下一步
    2. 项目名称字段中,输入项目名称并单击下一步 指定与插件名称类似的功能部件名称通常很有用;对于插件 com.ibm.field.birt.xpath_extensions,可能选择 com.ibm.field.birt.xpath_extensions.feature。
    3. 要将该插件与该功能部件捆绑在一起,请选中对应于步骤 1 中已创建的插件的复选框并单击完成 这会将该功能部件添加至“包资源管理器”视图,并且有关该功能部件的信息会显示在“概述”页面上的“功能部件清单编辑器”视图中。
    4. 在“概述”页面上的名称字段中,输入功能部件名称(例如 XPath Extensions Feature)。
    5. 在“概述”页面上,单击用于导出向导的链接。
    6. 选择归档文件,对文件(例如 xpath_extensions.zip)指定位置和名称,然后单击完成
    注: 可以将此功能部件插件用于多个定制 XPath 函数项目。
  6. 将新插件导入到正在其中设计报告的 Eclipse 实例中:
    1. 将该归档文件抽取到目录(例如 C:/temp/xpath_extensions)中。
    2. 在 Eclipse 中,单击帮助 > 软件更新 > 查找并安装
    3. 在“安装/更新”向导中,单击搜索要安装的新功能部件并单击下一步
    4. 单击新建本地站点,选择包含该功能部件和插件的文件夹,然后依次单击确定完成
    5. 在“搜索结果”对话框中,选择功能部件并单击下一步
    6. 如果同意许可协议的条款,请选择我接受许可协议中的条款并依次单击下一步完成
    7. 当接收到重新启动计算机的提示时,单击

结果

现在,可以在报告设计中使用该新的 XPath 扩展。
注: 报告设计的用户还必须先导入该新的功能部件,才能从依赖于定制 XPath 函数的报告设计生成报告。虽然主题“导入定制 XPath 函数”提供了常规信息,但是可能需要随 RPTDESIGN 文件提供用于说明用户可从何处获取该功能部件以及如何对它进行使用的定制用户文档。

反馈