从XSLT访问XSD标记



一些语言(尤其是DFDL和我正在考虑构建的另一种语言(在XSD架构标记上使用外部属性(即http://www.w3.org/2001/XMLSchema以外的命名空间中的属性(,以描述关于其中声明的项(例如complexType、simpleType、element(的其他元数据。示例如下:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:dfdl="http://www.ogf.org/dfdl/dfdl-1.0/">
<xs:element name="input">
<xs:complexType>
<xs:sequence dfdl:separator=":" dfdl:separatorPosition="infix">
<xs:element name="label" type="xs:string" />
<xs:element name="message" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema> 

(dfdl为外来属性前缀(

能够在模式感知XSLT中访问这些元数据将非常有帮助,例如用于编写转换例程。有办法做到这一点吗?

Saxon中没有简单的解决方案。编译后的模式(无论是Java对象还是SCM文件的形式(都不会保留源模式文档中不需要用于验证的任何内容。

然而,可能会有一个困难而冗长的解决方案。

看看saxon:type((和saxon:schema((的扩展函数。将saxon:type((应用于已验证的元素节点将获得复杂类型对象的类似映射的表示,而此映射的implementation属性将获得JavaUserComplexType对象。该对象上的getParticle()方法(您可以从XPath调用该方法作为Java自反扩展函数(返回一个代表xs:sequence元素的Particle对象。Particle实现Location,它通过getSystemId()getLineNumber()为您提供粒子在原始XSD中的源位置。使用doc()检索XSD模块,并搜索具有正确行号的粒子,然后检索其属性。

最新更新