Xml Unicode规范无大小写匹配可以在XSD中实现吗?

Xml Unicode规范无大小写匹配可以在XSD中实现吗?,xml,unicode,xsd,Xml,Unicode,Xsd,我正在为一个数据模型开发一个XML模式,该数据模型涉及不区分大小写的键,这些键基本上来自所有Unicode字符。在本文中,“不区分大小写”是根据Unicode规范的无大小写匹配算法定义的(中的定义D145)。无大小写匹配不能很好地与XSD 1.1身份约束相匹配,因此我正在考虑各种替代方案来定义必要的密钥唯一性约束,理想情况下不会丢失原始的、未规范化的密钥形式 目前,我只是希望约束要以符合规范化无大小写匹配的大小写折叠规范化形式呈现的键,以便它们彼此直接可比。为了使其有用,它不能依赖于扩展或特定于

我正在为一个数据模型开发一个XML模式,该数据模型涉及不区分大小写的键,这些键基本上来自所有Unicode字符。在本文中,“不区分大小写”是根据Unicode规范的无大小写匹配算法定义的(中的定义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>

价值1
(“Clé”应表示为“clé;”或相同字符序列的等效表示),但它与数据的本机规范化并不完全匹配,因为在某些情况下,Unicode大小写折叠并不等同于小写。所以

  • 在这种情况下,有没有一种方法可以根据我介绍的限制生成真正的Unicode大小写折叠规范化表单
  • 我真的需要吗?如果在我的模式中由断言测试的表单作为无大小写匹配行为的基础,该行为总是产生与Unicode的标准规范无大小写匹配算法相同的结果,那么我可以接受我得到的结果
    • 你问:

      在这种情况下,有没有一种方法可以根据我介绍的限制生成真正的Unicode大小写折叠规范化表单

      如果“true Unicode case Folding normalized form”是指将Unicode case_Folding()映射应用于字符串的结果,我认为答案是(可能是)“否”,这就是原因

      对于您正在使用的方法,您需要一个可以在断言中调用的函数(或者在您的示例中是函数的组合)。因此,只有当且仅当您可以调用一个简单的内置函数组合来生成它时,才有可能得到一个真正的案例折叠形式

      如果大小写折叠只是用新字符替换旧字符的问题,理论上可以通过调用
      translate()
      来处理,但参数字符串将无法管理。但是Case_折叠映射(如果我正确理解了您所指的文档)一些字符到字符串(和/或一些字符串到字符串),这使得
      translate()
      无法触及它

      如果不逐条检查Unicode字符数据库中的大小写折叠和小写条目,我不知道是否有可能证明这是不可能的。(也许调用lower-case()然后明智地使用replace()就可以做到这一点——但我认为这太难处理了

      当然,可以编写XQuery或XSLT函数来执行大小写折叠操作(与小写和大写相反),但无法在XSD断言中声明函数

      如果您能找到一个愿意接受XPath 3.0而不是2.0的XSD模式验证器,那么从理论上讲,编写您自己的函数是可能的。但是,除非您能够将尽可能多的细节转移到Unicode数据库的XML表示中,否则这将非常麻烦,这意味着只有在XSD处理器可用的情况下,它才能工作愿意评估对doc()的调用

      因此,在实践中,我认为答案是否定的,除非你愿意不遗余力地去实现它,并且也有一些运气

      我真的需要吗?如果在我的模式中由断言测试的表单作为无大小写匹配行为的基础,该行为总是产生与Unicode标准规范无大小写匹配算法相同的结果,那么我可以接受我得到的结果

      在这里,我也认为答案是“否”。您指向的URI的“默认大小写折叠”部分的第四段内容如下:

      任何两个字符串,在任何完整的 大小写转换,toUppercase(X)、toLowercase(X)或toTitlecase(X)将折叠为相同的大小写 通过toCasefold(X)操作生成的字符串

      由于XPath lower-case()函数被指定为实现Unicode小写映射,因此我认为这会导致任何小写($S1)等于小写($S2)的字符串S1和S2在Unicode toCasefold()下相等操作。Unicode中段落的措辞可能会导致一些互不区分大小写的字符串也会在toCasefold()下折叠为同一字符串,但我希望它们的意思是大小写折叠会影响规范化以及大小写。如果是这样,那么我想您调用Unicode-normalize()时将处理这些情况。(如果有其他字符串对toCasefold()返回相等的值,但unicode normalize(lower-case())不返回相等的值,那么您的断言将无法接受您希望接受的某些字符串对。但这些字符串对将是什么?)

      这个答案没有我希望的那么清晰,我怀疑我是否告诉过你任何事情