In last blog, we have some problems and their solution, in this thread, we are going to solve more specific problems.
Define id
Like Attribute?
<xs:attribute name="id" type="xs:ID"/>
Define ref
Like Attribute?
<xs:attribute name="ref" type="xs:IDREF"/>
Default Value for Element?
Short answer is no, xsd doesn’t provide this functionality.
Attributes can be set with a default value because it is relative simple, while elements can nested and combined, which is much more complex and hard to provide a default content.
As far as we know, there also exists no alternatives to provide a default value for a missing element. In order to provide this functionality, we add much more code when combined with jaxb.
Define key
& keyref
We define them in following steps:
- First, we must define
key
&keyref
in element body; - Second, define
key
in following format:
<key
id = ID
name = NCName
{any attributes with non-schema namespace . . .}>
Content: (annotation?, (selector, field+))
</key>
<xs:key name="key">
<xs:selector xpath=".//state"/>
<xs:field xpath="code"/>
</xs:key>
- Then, simple XPath syntax rule:
Expression | Description |
---|---|
nodename | Selects all nodes with the name “nodename” |
/ | Selects from the root node |
// | Selects nodes in the document from the current node that match the selection no matter where they are |
. | Selects the current node |
.. | Selects the parent of the current node |
@ | Selects attributes |
A simple key
& keyref
example (in which vehicle reference it’s father node):
<xs:element name="vehicle">
<xs:complexType>
<xs:attribute name="state" type="xs:integer"/>
</xs:complexType>
</xs:element>
<xs:element name="state">
<xs:complexType>
<xs:sequence>
<xs:element name="code" type="xs:integer"/>
<xs:element ref="vehicle"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element ref="state"/>
</xs:sequence>
</xs:complexType>
<xs:key name="state">
<!-- states are keyed by their code -->
<xs:selector xpath=".//state"/>
<xs:field xpath="code"/>
</xs:key>
<xs:keyref name="vehicleState" refer="state">
<!-- every vehicle refers to its state -->
<xs:selector xpath=".//vehicle"/>
<xs:field xpath="@state"/>
</xs:keyref>
</xs:element>
<state>
<code>12</code>
<vehicle state="12"/>
</state>
A more complicated xsd/xml code can be found in my git repo.
Ref
- key documentation
- xpath syntax
- key & keyref xsd file
- key & keyref xml file
- default value of a missing element
Written with StackEdit.
评论
发表评论