可以在XSD中实现Unicode规范无壳匹配



我正在使用涉及细分敏感键的数据模型的XML模式,该数据模型是从基本所有的Unicode字符中绘制的。在这种情况下,"不敏感"是根据Unicode规范无壳匹配算法定义的(Unicode规范版本第10.0章的第3章中的定义D145)。无壳匹配并不能与XSD 1.1身份约束很好地融合在一起,因此我正在考虑定义必要的钥匙唯一约束的各种替代方案,理想情况下,不会丢失键的原始,非归一化形式。

目前,我正在寻求仅限于以符合规范的无壳匹配一致的情况折叠归一化形式显示的键,以便它们彼此直接可比。为此,尽管我愿意依靠明确定义的可选行为,例如使用unicode-normalize() XPATH函数正常化以形式NFD。

将来,我可能还想验证两个字符串是彼此的规范无壳匹配(即约束两个属性值或元素的文本内容,而其属性值之一是彼此的规范无壳匹配),但这是一个不同的问题。

这是一个简化的示例模式,我认为它非常接近做我想做的事情:

<xsd:schema
    version="1.1"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:fn="http://www.w3.org/2005/xpath-functions"
    xmlns:my="urn:x-myns"
    targetNamespace="urn:x-myns"
    elementFormDefault="qualified">
  <xsd:element name="table" type="my:tableType">
    <xsd:key name="keyKey">
      <xsd:selector xpath="my:entry"/>
      <xsd:field xpath="@key"/>
    </xsd:key>
  </xsd:element>
  <xsd:complexType name="tableType">
    <xsd:sequence>
      <xsd:element name="entry" type="my:entryType"
                   minOccurs="0" maxOccurs="unbounded"/>
    </xsd:sequence>
  </xsd:complexType>
  <xsd:complexType name="entryType">
    <xsd:simpleContent>
      <xsd:extension base="xsd:string">
        <xsd:attribute name="key" type="xsd:string"/>
        <!-- MY BEST ATTEMPT SO FAR: -->
        <xsd:assert test="@key=fn:unicode-normalize(fn:lower-case(
            fn:unicode-normalize(@key, 'NFD')), 'NFD')" />
      </xsd:extension>
    </xsd:simpleContent>
  </xsd:complexType>
</xsd:schema>

足以拒绝

<table xmlns="urn:x-myns">
  <entry key="Clé">Value1</entry>
</table>

("clé"应以" cle&amp;#x0301;"或同一字符序列的等效表示),但它与数据的本机规范化不完全匹配,因为Unicode案例折叠不等于较低 - 在某些情况下进行。所以,

  • 在这种情况下,是否有一种方法可以在这种情况下产生真正的Unicode案例折叠式的归一化形式,但要受我提出的限制?
  • 我真的需要吗?如果我的模式中的断言对表格进行了测试,则可以作为无壳匹配行为的基础,该行为总是与Unicode的标准规范无壳匹配算法产生相同的结果,那么我就可以使用自己的东西。

你问:

在这种情况下,是否有一种方法可以在这种情况下产生真正的Unicode案例折叠式的归一化形式,但要受我提出的限制?

如果通过" true Unicode case折叠的归一化形式",则是指将unicode case_folding()映射应用于字符串的结果,我认为答案是(可能)"否",这就是原因。

对于所使用的方法,您需要一个函数(或示例中的功能组成),您可以在断言中调用。因此,只有当您可以调用内置功能的简单组成时,才可以在且仅当您可以调用一个简单的构图时获得真正的案例折叠表格。

如果case_folding只是将新字符替换为旧字符的问题,那么从理论上讲,人们可以通过呼叫translate()来处理它,但是参数字符串是无法管理的。但是case_folding地图(如果我已经理解了您正确指出的文档)字符串的某些字符(和/或字符串的某些字符串),这使得translate()无法触及。

不通过unicode字符数据库中的案例折叠和较低录音条目进入进入,我不知道可以肯定地证明它不能完成。(也许是对较低案例()的呼吁,然后明智地使用替换()可以解决问题 - 但我希望它太笨拙了。

当然,可以写XQUERY或XSLT功能来进行案例折叠操作(而不是较低的评估和上层命中)。但是没有办法在XSD断言中声明功能。

如果您可以找到愿意接受XPATH 3.0而不是2.0的XSD模式验证器,则在理论上可以编写自己的功能。但是同样,除非您可以将尽可能多的详细信息卸载到Unicode数据库的XML表示形式中,这将很麻烦,这意味着仅当XSD处理器愿意评估doc()的呼叫()。

时,它才能正常工作。

因此,在实践中,我认为答案是否定的,除非您愿意竭尽全力使它实现也有一些运气。

我真的需要吗?如果我的模式中的断言对表格进行了测试,则可以作为无壳匹配行为的基础,而无壳匹配行为总是与Unicode的标准规范无壳匹配算法产生相同的结果,那么我就可以使用自己的东西。

>

我也认为,答案是"否"。您指出的读取的"默认情况折叠"部分的第四段:

在任何一个完整的条件下,任何两个字符串都被认为是彼此的情况变体 案例转换,touppercase(x),tolowercase(x)或totitlecase(x)将折叠为同一 tocasefold(x)操作的字符串

由于指定了Xpath lower-case()函数为实现Unicode下盘映射,因此我认为这为您提供了任何较低案例($ s1)eq seq下case的字符串S1和S2的结果($ s2)在Unicode tocasefold()操作下将相等。Unicode中的段落的措辞打开了某些可能彼此不同的字符串的可能性 折叠到tocasefold()下的同一字符串(),但我希望他们所说的就是这种情况折叠会影响归一化和外壳。如果是这样,那么我认为您呼吁Unicode-Normalize()处理这些情况。(如果还有其他成对的字符串,tocasefold()返回相等的值,但是Unicode niCode nodaralialize(lower-case())却没有,那么您的断言将无法接受您希望接受的某些对。成对的字符串是?)

这个答案比我希望能做到的要清脆,我怀疑我已经告诉过您您还不知道的任何事情。没有时间在Unicode数据库中进行更多的研究时间,我认为不可能做出更明确的答案。但是,如果您主要希望一个独立的观察者确认您似乎处于正确的道路上,我当然可以这样做。好工作!还有祝你好运!

最新更新