具有不同子元素的不同匿名 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_VAT
、TRXML_Social
、TRXML_Income
.
- 修改代码注册码:
RegisterChildNode('R', TXMLR_VAT);
每款R.
然后编译成功。
而且我觉得使用匿名复杂类型是不好的设计。
我不认为匿名复杂类型本质上是坏的,但使用它们会产生类型 non-reusable,因此只应针对绝对只适用于一个元素的内容模型进行。
如果不同的 R 元素有不同的内容模型,那么除了用这种方式描述结构之外别无选择。就 XML 而言,这是一个完美的设计,但当然,如果您选择的数据绑定工具无法处理它,您将需要找到一些解决方法。不要忽视将数据进行 XSLT 转换为您的数据绑定工具可以处理的不同格式的可能性。
我收到了政府发来的 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_VAT
、TRXML_Social
、TRXML_Income
. - 修改代码注册码:
RegisterChildNode('R', TXMLR_VAT);
每款R.
然后编译成功。
而且我觉得使用匿名复杂类型是不好的设计。
我不认为匿名复杂类型本质上是坏的,但使用它们会产生类型 non-reusable,因此只应针对绝对只适用于一个元素的内容模型进行。
如果不同的 R 元素有不同的内容模型,那么除了用这种方式描述结构之外别无选择。就 XML 而言,这是一个完美的设计,但当然,如果您选择的数据绑定工具无法处理它,您将需要找到一些解决方法。不要忽视将数据进行 XSLT 转换为您的数据绑定工具可以处理的不同格式的可能性。