具有不同子元素的不同匿名 XSL 复杂类型具有通用名称 - Delphi 数据绑定和良好的设计?

Different anonymous XSL complex types having different subelements with common name - Delphi Data Binding and good design?

我收到了政府发来的 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 来说真的是好设计还是坏设计?

当我尝试从第 3 方工具(例如来自 Delphi XML 我试图生成 Delphi XML 绑定 *.pas 单元的数据绑定,当然,XML 绑定向导会创建 3 interfaces IXMLR and 3 classes TXMLR,当然这样的代码会被编译器拒绝。我尝试为每个 R 提供特定的 'Binding Options - Identifier Name, Data Type' - 例如R_VAT、R_Social、R_Income。并且 XML 绑定工具生成与这些词的交互,但 class 名称仍然是相同的 TR。

有没有办法为具有通用名称的不同元素配置 XML 数据绑定向导?

解决方案是耐心使用 XML 数据绑定工具,然后手动编辑生成的 *.pas 文件:

  • 将每个 TRXML class 重命名为 TRXML_VATTRXML_SocialTRXML_Income.
  • 修改代码注册码:RegisterChildNode('R', TXMLR_VAT);每款R.

然后编译成功。

而且我觉得使用匿名复杂类型是不好的设计。

我不认为匿名复杂类型本质上是坏的,但使用它们会产生类型 non-reusable,因此只应针对绝对只适用于一个元素的内容模型进行。

如果不同的 R 元素有不同的内容模型,那么除了用这种方式描述结构之外别无选择。就 XML 而言,这是一个完美的设计,但当然,如果您选择的数据绑定工具无法处理它,您将需要找到一些解决方法。不要忽视将数据进行 XSLT 转换为您的数据绑定工具可以处理的不同格式的可能性。