XSLT支持xsd中的xs:import



我有几个不属于我的xsd,需要转换为内部xml标准才能在我们的应用程序中工作。

有一个xslt脚本可以通过ant任务为我们完成这项工作,但是现在我们遇到了一个障碍:
当xsd包含xs:import语句时,xslt将无法找到在引用的xsd中定义的字段。

示例xsd's:
main.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema>
<xs:import namespace="urn:company:ns.common" schemaLocation="common.xsd"/> 
<xs:complexType name="User">
<xs:element ref="common:Address">
</xs:complexType>
</xs:schema>

common.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns="urn:company:ns.common">
<xs:complexType name="Address">
<xs:sequence>
<xs:element name="Street" type="xs:string"/>
<xs:element name="HouseNumber" type="xs:number"/>
</xs:sequence>
</xs:complexType>
</xs:schema>

虽然我不能显示当前的xslt,因为它类似于泄露一些公司信息,但预期的输出应该是这样的:

<User>
<Address>
<Street></Street>
<HouseNumber></HouseNumber>
</Address>
</User>
此时,XSLT会忽略在导入的xsd中找不到的内容。

错误的结果:

<User></User>

不做一个或多个简化的假设,你手上就有一个复杂的子项目,而不是一个SO Q/a。我将提出一个关键的简化假设:

  • 单独的xsd对名称空间的使用只是组织性的,实际上不需要消除本地名称的歧义。

如果你可以做这个简化的假设,然后考虑调整xsd:imports基本上是xsd:includes,然后使用XSD扁化通过

  1. 许多商业XML/XSD编辑器中可用的工具,或者

  2. W。Paul Kiel的XML SchemaLightener,它有一个flatten函数,可以作为工具或作为起点,因为它是用XSLT编写的

这样,XSLT就可以接受单个平面化的XSD作为输入,而不是单独的XSD的集合。

参见

  • 自动将多个xsd合并为一个
  • 应该
  • 正规化XSD
  • xsd:include和xsd:import有什么区别?