xml - 不同的匿名 XSL 复杂类型具有不同的具有通用名称的子元素 - Delphi 数据绑定和良好的设计?
问题描述
我从我们的政府收到了 XSL,其中包含以下内容:
<xs:element minOccurs="0" maxOccurs="1"
name="VATTaxFiles">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded"
name="R" nillable="true">
<xs:complexType>
some stanza 1
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element minOccurs="0" maxOccurs="1"
name="SocialSecurityTaxFiles">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded"
name="R" nillable="true">
<xs:complexType>
some stanza 2
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element minOccurs="0" maxOccurs="1"
name="IncomeTaxFiles">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded"
name="R" nillable="true">
<xs:complexType>
some stanza 3
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
在我看来,这个模式的设计有两个不好的问题:1)它使用匿名复杂类型;2) 它具有通用名称 ( R
) 但形状不同的子元素。对于 XSL,这真的是好还是坏的设计?
当我试图从 3rd 方工具中使用这个模式时,这种设计会产生问题,例如来自我试图生成 Delphi XML 绑定 *.pas 单元的 Delphi XML 数据绑定,但当然,XML 绑定向导创建 3 个接口IXMLR 和 3 类 TXMLR,当然,这样的代码会被编译器拒绝。我尝试为每个 R 提供特定的“绑定选项 - 标识符名称、数据类型” - 例如 R_VAT、R_Social、R_Income。XML Binding 工具会生成与这些单词的交互,但类名仍然是相同的 TR。
有没有办法为具有通用名称的不同元素配置 XML 数据绑定向导?
解决方案
我不认为匿名复杂类型本质上是不好的,但是使用它们会使类型不可重用,所以它应该只用于绝对只适用于一个元素的内容模型。
如果不同的 R 元素有不同的内容模型,那么就真的没有办法用这种方式来描述结构了。就 XML 而言,这是一个完美的设计,但当然,如果您选择的数据绑定工具无法处理它,您将需要找到一些解决方法。不要忽略对数据执行 XSLT 转换为数据绑定工具可以处理的不同格式的可能性。
推荐阅读
- vue.js - Vuetify - v-data-table 打破 v-card 的高度
- javascript - 引导 datePicker 如何根据需要进行验证
- c++ - 我如何知道 set.insert() 是否由于 C++ 中的内存不足而失败?
- php - 当 textarea 值具有 iframe 时,Laravel POST 请求不起作用
- c++ - 如何将变量传递给 makefile 中的规则?
- c - 如何在 C 中使用 printf() 和 scanf() 而不转到下一行?
- java - 无需 unicode 转义即可读写 Java 属性
- node.js - 如何从更新的 Node 和 npm 版本中解决这些错误..?
- amazon-web-services - Aws Transribe 无法在 boto3 中没有 LanguageCode 的 start_transcription_job
- java - 如何将 Instant 转换为 Int