2017-07-18 17 views
1

XMLファイルに対してXSDを作成しようとしています。座標の数が、私はXSDxs:stringようCoordsのタイプを指定しようとしています、固定数ではないのでXML - 子要素を含む要素の型をXSDの文字列として指定します

<Coords> 
      <Coord1>L1: 50,L2: 9 </Coord1> 
      <Coord2>L1: 51,L2: 19 </Coord2> 
      <Coord3>L1: 521,L2: 29 </Coord3> 
      <Coord4>L1: 53,L2: 39 </Coord4> 
      <Coord5>L1: 54,L2: 49 </Coord5> 
      <Coord6>L1: 55,L2: 59 </Coord6> 
</Coords> 

XMLのようなブロックが含まれています。 xmlには、XSDに基づいてそれを検証できるように変更する必要がありますか?文字列型の

<xs:element name="Coords" type="xs:string"/> 
+0

文字列型の[restriction](https://www.w3schools.com/xml/el_restriction.asp)を正規表現で使用できます。 – Alexander

答えて

2

使用restriction:私はメモ帳でXSDを++使用してXMLを検証しようとしたとき

は、私がCoords': Element content is not allowed, because the type definition is simple.

XSDの一部であるとしてエラーが発生します。たとえば:

<xs:simpleType name="Point"> 
    <xs:restriction base="xs:string"> 
    <xs:pattern value="L1\:\s?\d+,\s?L2\:\s?\d+"/> 
    </xs:restriction> 
</xs:simpleType> 

は、その後、あなたのCoord要素に適用することが可能である:

<xs:element name="Coords"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element name="Coord" type="Point" maxOccurs="unbounded"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 
+0

しかし、子要素名はCoordではありません。 Coord1、Coord2、... – Jackzz

+0

@Jackzz、内部の要素の数が不明なので同じ名前を使用するように助言します。必要な要素をインデックスで取得したり、追加の属性を使用することができます。 – Alexander

0

XSDではなく、それが可能にすべての可能な入力文書の構造を記述するために作るより良いXML設計を奨励しようとします。要素名coord1、coord2、coord3 ...を使用することは間違いなく良いXML設計です。 (はるかに良い、それは純粋なノイズであるため、番号を忘れて、<coord nr="1"/>、またはさらに良いでしょう:それはそこにいなかった場合、あなたはそれを再構築することができ)

ので正確coordsことを言うためにXSD 1.0での方法はありませんXが数値1..nを順番に取るとは言えませんが、Xは数字です。coordXという名前の子シーケンスがあります。

<xs:assert xpath="every $n in * satisfies (matches(name(), 'coord\d+') 
and number(substring-after(name(), 'coord')) = count(preceding-sibling::*) + 1"/> 

しかし、再びあなたの質問を読んで、あなたはXMLのデザインを変更する用意があるかのように聞こえる:あなたはもちろんのXSD 1.1、中にアサーションを使用してそれを行うことができます。その場合は、すべての子の名前をCoordに変更し、要素のシーケンスで構成される複合型のCoordsを定義します。各要素の型はxs:stringです。

関連する問題