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