xs:NCNameタイプとは何ですか、いつ使用する必要がありますか?


97

スキーマジェネレーターを使用してxmlファイルの1つを実行したところ、1つのノードを除いて、生成されたものはすべて期待どおりのものでした。

<xs:element name="office" type="xs:NCName"/>

正確にはxs:NCName何ですか?そして、なぜそれを使うのでしょうxs:stringか?

回答:


92

NCNameは、「name」などの非コロン付きの名前です。「ns:name」などの修飾名であるQNameと比較されます。名前が別の名前空間で修飾されていない場合は、NCNameです。

xs:stringは名前に制限を課しませんが、xs:NCNameは基本的に ":"を文字列に表示することを許可しません。


1
空の文字列も許可されていませんxs:NCName
WeizhongTu 2018年

108

@skylは実際に私にこの答えを書くように促しましたので、冗長性に注意してください。

NCName「コロンなしの名前」を表します。NCNameは、XMLスキーマの正規表現として定義できます。[\i-[:]][\c-[:]]*

...そしてその正規表現はどういう意味ですか?

\iそして、\cXMLスキーマ定義で定義された複数文字のエスケープです。
http://www.w3.org/TR/xmlschema-2/#dt-ccesN
\iは、一連の初期XML名文字のエスケープであり、XML名文字\cのセットです。 [\i-[:]]\i、コロン文字で構成されるセットを除く、セットで構成されるセットを意味します:。つまり、わかりやすい英語では、「最初の文字はすべてではなく:」という意味になります。正規表現全体は、「コロンではなく最初の1つのXML名文字、その後に0個以上のXML名文字が続きますが、コロンはありません」と読みます。

NCNameの実用的な制限

NCNameでの現実的な制限が、それはのようないくつかの記号文字を含めることはできませんということです:@$%&/+,;、空白文字または別の括弧。さらに、NCNameは数字、ドット、またはマイナス文字で始めることはできませんが、それらは後でNCNameに出現できます。

NCNameが必要な場所

名前空間に準拠したXMLドキュメントでは、すべての名前が修飾名またはNCNameである必要があります。以下の値は、NCNames(修飾名ではない)である必要があります。

  • 名前空間接頭辞
  • IDを表す値
  • IDREFを表す値
  • 表記を表す値
  • 処理命令ターゲット
  • エンティティ名

3
「さらにNCNameを数字で始めることはできません」という行は、数字を「xs:ID」にすることはできないことを理解するのに役立ちました
Sean Murphy

その式をJavaやJSなどのプログラミング言語に変換するにはどうすればよいですか?
calbertts 2016年


次の正規表現を使用して、通常のCNameであるかどうかを確認できます:「[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ _] [\\ w \\。\\-\\ d] *」。つまり。値は文字またはアンダースコアで始まり、単語、ドット、ダッシュ、アンダースコア、数字が含まれている必要があります。regexr.com
Naxos84

上記の私の正規表現はラテン文字のみを処理します。あなたは、仕様に従っているNCNameの完全なチェックをしたい場合w3.org/TR/1999/REC-xml-names-19990114/#NT-NCNameあなたはこのクラスを使用する必要があります。java2s.com/Code/Java/XML/...を
Naxos84

29

実際に言えば...

使用できる文字: -.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz

また、-および.値の最初の文字として使用することはできません。

許可されていない文字: !"#$%&'()*+,/:;<=>?@[\]^`{|}~


2
これには、たとえばéやøなど、許可されている多くの文字が欠落していると思います。
Eric Bloch

これらの非ASCIIのケースをカバーするには、文字セットの一部として\ p {L} +を含める必要があります
Kenston Choi 2013

11
数字も最初の文字として使用できません。
Thilo、2015

5

http://books.xmlschemata.org/relaxng/ch19-77215.html

スペースやコロンは不要です。「_」と「-」を使用できます。

文字列の代わりにこれを使用して、値が許可されているものに制限されていることを検証できるようにします。たとえば、djangoの「スラッグ」の概念など、名前/識別子の特定の規則にうまく対応します。

私は[\i-[:]][\c-[:]]*英語に翻訳する人に賛成票を投じます。


11
[\i-[:]][\c-[:]]*英語に翻訳する回答を追加しました。あなたが約束したように、先に進んで
賛成投票
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.