我正在研究一種數據模型的XML模式,該數據模型涉及基本上來自所有Unicode字符的不區分大小寫的鍵。在這種情況下,根據Unicode規範無匹配匹配算法(Chapter 3 of version 10.0 of the Unicode specification中的定義D145)定義「不區分大小寫」。無匹配匹配與XSD 1.1身份約束不匹配,所以我正在考慮用於定義必要的密鑰唯一性約束的各種備選方案,理想情況下不會丟失密鑰的原始未規範化形式。可以在XSD中實現Unicode規範無格式匹配嗎?
目前,我正在尋找簡單的約束鍵來呈現與規範無匹配匹配一致的案例摺疊歸一化形式,以便它們可以直接相互比較。爲了有用,它不能依賴擴展或特定於實現的行爲,儘管我願意依賴定義明確的可選行爲,例如使用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>
(「CLE」應作爲「CLE & #x0301;「或相同字符序列的等效表示),但它不完全匹配數據的本機規範化,因爲在某些情況下,Unicode大小寫摺疊不等同於較低的大小寫。所以,
- 有沒有產生在這方面真正的Unicode的情況下折規範化的形式,受到我提出的限制的方法嗎?
- 我真的需要嗎?如果由我的模式中的斷言測試的表單作爲無狀態匹配行爲的基礎,它總是產生與Unicode的標準規範無匹配匹配算法相同的結果,那麼我可以忍受我得到的結果。
我不買你的說法,'FN之間的區別:小寫()'和Unicode'toCaseFold()'不會有所作爲。Unicode似乎在說'toCaseFold(s)== toCaseFold(小寫字母)'表示所有的Unicode字符串's',但它並不遵循'toCaseFold(s)==小寫( s)'或unicode-normalize(toCaseFold(s),'NFD')== unicode-normalize(小寫字母,'NFD')'。 (我很抱歉混合XPath和Unicode規範函數的僞表達式。) –
儘管如此,我很欣賞證實我不能擁有我想要的東西(ob-Jagger在這裏)。我認爲我有一個合理的近似值,從文獻的角度來看,我認爲這是令人滿意的。無論如何,我希望如此,因爲我沒有辦法做得更好。 –
關於toCaseFold()和lower-case()的關係,你已經說服了我,Unicode規範意味着你說什麼。但是,我認爲你的問題的關鍵條件不是你引用的那個,而是對於所有的s和t'unicode-normalize(小寫字母,'NFD')== unicode-normalize(小寫(t),'NFD')iff toCaseFold(s)== toCaseFold(t)'。 –