在 tt:group 标准反序列化中忽略结束标记

Ignore closing tag in tt:group standard deserialization

根据文档:

Only one deserialization-relevant case that does not contain a pattern can be specified.
This case is called standard deserialization.

现在的问题是,在另一个标签内,标准反序列化也会匹配结束标签。
假设我们有以下 xml:

<X0>
   <X1>1</X1>
   <X1>2</X1>
   <X2>3</X2>
   <X2>99</X2>
   <X2>4</X2>
   <X3>5</X3>
   <X4>6</X4>
   <X2>888</X2>
</X0>.

现在与 ST

<X0>
  <tt:group>
    <tt:cond frq="*">
      <X1>
        <tt:value ref="ROOT1"/>
      </X1>
    </tt:cond>
    <tt:cond frq="?">
      <X90>
        <tt:value ref="ROOT4"/>
      </X90>
    </tt:cond>
    <tt:cond frq="*">
      <tt:skip count="1"/>
    </tt:cond>
  </tt:group>
</X0>

我们将彻底遍历输入 XML,因为 X90 是可选的且从未找到。最后一次迭代将包含 </X0>。这也匹配默认的序列化,并会跳转到这种情况。跳过结束标记的结果是 CX_ST_MATCH 异常。

如何确保只跳过起始标签?

我不知道是否有 <tt:skip .../> 的解决方案,但有一个替代方案 tt:extensible="on" 属性(值 deep-staticdeep-dynamic 也可以被使用),以便“可以跳过未明确指定的元素而无需进一步处理”:

<X0 tt:extensible="on">
  <tt:group>
    <tt:cond frq="*">
      <X1>
        <tt:value ref="ROOT1"/>
      </X1>
    </tt:cond>
    <tt:cond frq="?">
      <X90>
        <tt:value ref="ROOT4"/>
      </X90>
    </tt:cond>
  </tt:group>
</X0>

注意:<X1><tt:value ref="ROOT1"/></X1> 可以简化为 <X1 tt:value-ref="ROOT1"/>