xsd:assert(复杂字符验证)

时间:2019-02-01 09:52:37

标签: xpath xsd-1.1

是否有办法验证模板仅包含传递给@param的那些字符?

我考虑了带有xpath函数(fn :)的选项,但是没有找到合适的选项。

例如,这是2个有效xml:

<rule type="myRule" template="A-B-CB">
  <attribute param="B"/>
  <attribute param="A"/>
  <attribute param="C"/>
</rule> 


<rule type="myRule" template="A(C)-B">
  <attribute param="C"/>
  <attribute param="A"/>
  <attribute param="B"/>
</rule> 

和2个无效的xml:

<rule type="myRule" template="AB-CD">
  <attribute param="A"/>
  <attribute param="B"/>
  <attribute param="C"/>
</rule> 


<rule type="myRule" template="AC">
  <attribute param="A"/>
  <attribute param="B"/>
  <attribute param="C"/>
</rule>

也许有想法如何使用schematrone或其他方式实现它?

1 个答案:

答案 0 :(得分:1)

因此@template中的字母集必须与./attribute/@param中的字母集完全相同吗?

也就是说,distinct-values(string-to-codepoints(replace(@template, '\P{L}', '')))必须与distinct-values(attribute/@param/string-to-codepoints())相同。

那么您如何断言在置换下两个序列包含相同的值?

在XPath 3.1中,deep-equal(sort($X), sort($Y))

在XPath 2.0中,我想不出什么比

empty($X[not(.=$Y)]) and empty($Y[not(.=$X)])

我会让你把它们放在一起。