一些语言(特别是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中访问这些元数据将非常有用,比如编写转换例程。有办法做到这一点吗?
发布于 2022-10-17 22:57:49
在撒克逊没有简单的解决方案。编译后的模式(无论是以Java对象的形式还是SCM文件的形式)不会保留源模式文档中任何不需要用于验证的内容。
然而,可能有一个困难和冗长的解决办法。
看看saxon:type()和saxon:schema()扩展函数。将saxon: type ()应用于已验证的元素节点,您将得到复杂类型对象的类似映射的表示,而此映射的implementation属性将使您进入UserComplexType对象。这个对象上的getParticle()方法(您可以从XPath调用它作为Java自反扩展函数)返回一个表示xs:sequence元素的Particle对象。Particle实现了Location,它通过getSystemId()和getLineNumber()给出了粒子在原始XSD中的源位置。使用doc()检索XSD模块,并搜索具有正确行号的粒子,然后检索其属性。
https://stackoverflow.com/questions/74101838
复制相似问题