XSD 限制
XSD 支持的当前实现仅限于标签、数组和静态属性。不支持将静态属性作为 xpath 表达式来查找侦听器映射 ID(有关更多信息,请参见侦听器 XSD 格式)。
事务服务器不使用 XML 验证解析器,也不根据 XML 架构验证收到的 XML。因此,XML 必须反映 XSD 结构,确保 XML 标签值与变量正确匹配。
唯一实现的方面是 maxLength,其用于确定逻辑变量中字符串的大小。
事务服务器不支持的 XSD 构造
当前,事务服务器不处理并会忽略以下 XML 架构构造:
- Choice(选项)
- 除非选项选择中的所有元素都是字符串,否则 XML 架构选项构造将在处理 XML 时发生错误。
- Array Size(数组大小)
- 在处理 XML 中的数组时(例如,使用 maxOccurs="unbounded" 指定的元素),在 'Rows In'(行输入)字段中指定的数组大小表示触发器将要处理的 XML 元素数组数量的上限。如果 XML 中收到的行数小于 'Rows In'(行输入)中指定的值,则不会发生错误。对于每个以 maxOccurs="unbounded" 标识的 XML 架构元素,将创建事件变量(Listener Map(侦听器映射))或输入/输出变量(Transport Map(传输映射)),它们以 _nbrRows 结尾。它将存储收到的实际行数,以 'Rows In'(行输入)值为上限。在为设备、本地或静态变量分配侦听器触发事件变量或事务动作输出变量时,应引用此值来确定要处理的行数。如果不存在 XML 元素数组,则相应的 _nbrRows 变量将设为 0。使用事务动作输入变量时,可以设置此字段以指定传输映射应处理的数组项的数量。将该值设置为 0,表示不想指定任何要处理的内容。
- Namespace(命名空间)
- 事务服务器 XSD 架构处理不支持命名空间。
下面显示了事务服务器不支持的 XSD 构造的示例:
XSD 元素 | XSD 示例 |
---|---|
choice(选项) | <xsd:group name="priceGroup"> <xsd:choice id="pg.choice"> <xsd:element name="fullPrice" type="fullPriceType"/> <xsd:element name="salePrice" type="salePriceType"/> <xsd:element name="clearancePrice" type="clearancePriceType"/> <xsd:element name="freePrice" type="freePriceType"/> </xsd:choice> </xsd:group> |
Attributes(静态属性) | 事务服务器支持静态属性,但不支持静态属性的以下选项: 忽略 use="prohibited"。 忽略 form="qualified",并以 XML 架构默认的 form="unqualified" 进行发送。 |
Nil 和缺失元素处理
- 如果 XSD 架构使用 minOccurs="0" 定义一个元素,并且 XML 不含标签,则接受 XML,但是对相应触发器事件变量的所有引用都将发生 -5111(Event Variable Not Defined(未定义事件变量))或 -5209(Action variable is not serviced(未提供动作变量))错误。为避免这种情况,您应当在访问相应的触发器事件或事务动作输出变量之前测试相应的 _nbrRows 变量的值是否大于 0。
- 如果 XML 包含非 null 的空标签(例如 <tag></tag>),则映射到逻辑变量的数据的值将取决于逻辑变量数据类型。
- 类型为 String(字符串)的逻辑变量将被分配一个空字符串(例如 "")。
- 除非 XSD 将元素定义为 nillable="true" 并且 XML 元素包含 "nil" 静态属性,否则将拒绝数字类型(INT2、INT4 等)的逻辑变量。例如,<tag nil="true"></tag>。在这种情况下,由于触发器中无法表示 NULL 值,因此与变量相关联的状态代码将为 -5111 或 -5209。可使用 'Check Variable Status'(检查变量状态)动作来测试变量的状态。或者,可以将逻辑变量类型更改为 String(字符串),并在触发器逻辑中执行数据类型转换。
错误代码
不得操作错误代码(例如,Variable Not Serviced (-5209)(未提供变量)或 Event Variable Not Defined (-5111)(未定义事件变量))或将其分配给另一个变量,否则触发器中将发生错误。若要检查变量错误代码,请使用 Device(设备)类别中的 Check Variable Status(检查变量状态)触发器动作。
如果数组中的一个元素发生错误,例如 Variable Not Serviced(未提供变量)或 Event Variable Not Defined(未定义事件变量),则整个数组将无效。如果 XSD 包含默认值或固定值,则将在元素非 nillable 时使用这些值。
不支持的 XML 架构类型
事务服务器不支持以下 XML 架构类型:
- base64Binary
- hexBinary
- duration
- NOTATION
如果 XSD 包含上述类型的元素,它们必须是可选的或被设置为 nillable="true" 才能交由事务服务器处理,否则事务服务器将无法从传输映射 XSD 生成有效的 XML 或在侦听器中成功处理传入的 XML。
数据类型将按照以下方式映射到 XML 架构类型:
XML 架构类型 | 数据类型 |
---|---|
boolean | BOOL |
byte | INT1 |
date | TIMESTAMP |
dateTime | TIMESTAMP |
decimal | FLOAT8 |
double | FLOAT8 |
float | FLOAT4 |
gDay | UINT1 |
gMonth | UINT1 |
gMonthDay | STRING |
gYear | UINT4 |
gYearMonth | STRING |
int | INT4 |
integer | INT8 |
long | INT8 |
short | INT2 |
string | STRING |
token | STRING |
normalizedString | STRING |
language | STRING |
Time | STRING(8) |
unsignedByte | UINT1 |
unsignedInt | UINT4 |
unsignedLong | UINT8 |
unsignedShort | UINT2 |
positiveInteger | UINT8 |
negativeInteger | INT8 |
nonPositiveInteger | INT8 |
nonNegativeInteger | UINT8 |
anyURI | STRING |
QName | STRING |
NCName | STRING |
Name | STRING |