Whitespace restriction in Id - xsd

I don't want any whitespaces in my ids. So I made a pattern which forbids it.
By default Xml parsers trim the attributes' values. I used <xs:whiteSpace value="preserve"/> to keep them.
But my Xml-Schema validator prints this warning:
It is an error if 'whiteSpace' is among the members of {facets} of
{base type definition}, {value} is 'replace' or 'preserve',
and the {value} of the parent 'whiteSpace' is 'collapse'.
This is my whole type:
<xs:simpleType name="Id">
<xs:restriction base="xs:ID">
<xs:whiteSpace value="preserve"/>
<xs:pattern value="[^\s].*[^\s]"/>
</xs:restriction>
</xs:simpleType>

Related

Generating XSD from RelaxNG while keeping root-element restriction

I want to convert the following schema from RNC/RNG to W3C XSD.
default namespace = ""
namespace a = "http://relaxng.org/ns/compatibility/annotations/1.0"
namespace rng = "http://relaxng.org/ns/structure/1.0"
start = starting_risk
starting_risk =
element risk {
element continents { Continents }?
}
Continents = element continent { Continent }+
Continent =
element country { Country }*,
element sea { Sea }*
Country = xsd:string { minLength = "1" maxLength = "100" }
Sea = xsd:string { minLength = "1" maxLength = "100" }
Using trang, I end up with
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="risk">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" ref="continents"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="continents" type="Continents"/>
<xs:complexType name="Continents">
<xs:sequence>
<xs:element maxOccurs="unbounded" ref="continent"/>
</xs:sequence>
</xs:complexType>
<xs:element name="continent" type="Continent"/>
<xs:complexType name="Continent">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" ref="country"/>
<xs:element minOccurs="0" maxOccurs="unbounded" ref="sea"/>
</xs:sequence>
</xs:complexType>
<xs:element name="country" type="Country"/>
<xs:element name="sea" type="Sea"/>
<xs:simpleType name="Country">
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
<xs:maxLength value="100"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="Sea">
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
<xs:maxLength value="100"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
The problem is that the hierarchy is lost. The 'risk' element is the root of the schema and the only valid element at that level. In the RNC, the relationship between 'risk' and 'continent' elements is parent to child. But in the XSD, they are siblings. What am I doing wrong/ have I not understood?
You’re not doing anything wrong. I think unfortunately you just can’t use trang to generate an XSD from your RNC schema that preserves the restriction on what’s allowed as the root element.
You could instead manually create an XSD restricted to having risk be the only global element, with all the rest of the elements each being a local element. But (as far as I know) you can’t generate such an XSD using trang. The reason is that (again, as far as I know at least) trang basically always generates XSDs only with global elements.
You might think you could generate an XSD with local elements if you wrote your RNC like this:
start =
element risk {
element continents {
element continent {
element country { xsd:string { minLength = "1" maxLength = "100" } }*,
element sea { xsd:string { minLength = "1" maxLength = "100" } }*
}+
}?
}
That’s basically structured in the same way you’d want to structure your XSD if you did it manually.
But if you run that through trang to generate an XSD, you’ll find that every single element comes out as a global element in the resulting XSD. That’s just how trang always does it.
So unless there’s some magic way I’m unaware of to force trang to do otherwise, your only alternative if you want to restrict your XSD schema to only having risk allowed as the root element is, create the XSD manually.
I guess that could be seen as a design flaw in trang, but arguably the real problem is that XML Schema by design has nothing similar to RelaxNG’s start to explicitly specify a root element.
If XML Schema did have a similar simple way like RelaxNG’s start to specify what’s allowed as the root element, then trang could just output that in the XSD and you’d have what you want.
But because XSD has nothing like start, your only mechanism for restricting your schema to having only one particular root element is to completely (re)structure your XSD into the “local style”.
However, as mentioned earlier in this answer, you unfortunately can’t generate such a “local style” XSD from RelaxNG sources using trang. You instead must separately create the XSD manually.
It’s imaginable trang ideally could have been designed with some option to allow you to generate “local style” XSDs or maybe with some heuristics to somehow infer when that’s the output style it should use. But the reality is, that’s not the way trang actually works, and it’s not going to change.
So while I’m sure that isn’t the answer you were hoping to get, I hope it helps clarify things.

Can a property in OWL be objectProperty and datatypeProperty at the same time

I want to denote the following xs:simpleType from XSD in OWL:
<xs:simpleType name="test">
<xs:union memberTypes="xs:normalizedString">
<xs:simpleType>
<xs:restriction base="xs:normalizedString">
<xs:enumeration value="123"/>
<xs:enumeration value="456"/>
</xs:restriction>
</xs:simpleType>
</xs:union>
</xs:simpleType>
I use equivalentClass to denote xs:enumeration:
<owl:Class rdf:about="testEn">
<owl:equivalentClass>
<owl:Class>
<owl:oneOf rdf:parseType="Collection">
<rdf:Description rdf:about="testEn_123"/>
<rdf:Description rdf:about="testEn_456"/>
</owl:oneOf>
</owl:Class>
</owl:equivalentClass>
</owl:Class>
And link xs:normalizedString and the equivalentClass with unionOf.
xs:normalizedString couldn't be expressed as Class in OWL, right? So I have a property that is objectProperty and datatypeProperty at the same time.
Not in OWL 2 DL, see https://www.w3.org/TR/owl2-new-features/#F12:_Punning
...However, OWL 2 DL still imposes certain restrictions: it requires that a name cannot be used for both a class and a datatype and that a name can only be used for one kind of property. ...

How to solve serialization ambiguity with xml attributes?

I want to serialize a valid xml with an XmlSerializer. But I got this error message:
"There was an error reflecting property 'Descriptions'. ---> System.InvalidOperationException: The top XML element 'Description' from namespace 'ddi:reusable:3_2_dev' references distinct types System.Collections.Generic.List`1[Opit.Rogatus.DdiObjects.DdiContent] and Opit.Rogatus.DdiObjects.DdiContent. Use XML attributes to specify another XML name or namespace for the element or types.."
I have this class that needs to be serialized. And there is a property Descriptions which marked for the serializer to rename it to Description. But since there is another Description apparently in the reusable namespace I got an error.
xsd for category:
<xs:complexType name="CategoryType">
<xs:annotation>
<xs:documentation>A description of a particular category or response. OECD Glossary of Statistical Terms: Generic term for items at any level within a classification, typically tabulation categories, sections, subsections, divisions, subdivisions, groups, subgroups, classes and subclasses.</xs:documentation>
</xs:annotation>
<xs:complexContent>
<xs:extension base="r:VersionableType">
<xs:sequence>
<xs:element ref="CategoryName" minOccurs="0" maxOccurs="unbounded"/>
<xs:element ref="r:Label" minOccurs="0" maxOccurs="unbounded">
<xs:annotation>
<xs:documentation>A display label for the category.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element ref="r:Description" minOccurs="0">
<xs:annotation>
<xs:documentation>Description/definition of the category. Note that comparison of categories is determined by the Definition rather than the Label. For example, while the Definition of a Chemist in London and a Pharmacist in New York is the same and comparable, the definitions of Chemist in each location differ significantly and are NOT comparable</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element ref="r:ConceptReference" minOccurs="0">
<xs:annotation>
<xs:documentation>Reference to a defining concept.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element ref="Generation" minOccurs="0">
<xs:annotation>
<xs:documentation>Generation/derivation details of the category.</xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
<xs:attribute name="missing" type="xs:boolean" use="optional">
<xs:annotation>
<xs:documentation>Indicates if the category contains missing data or not.</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:extension>
</xs:complexContent>
[XmlRoot(ElementName = "Category", Namespace = LogicalProductNamespace)]
public class DdiCategory : AbstractVersionable
{
[XmlElement(ElementName = "CategoryName")]
public List<DdiName> CategoryNames { get; set; }
[XmlArray(ElementName = "Description", Namespace = ReusableNamespace)]
[XmlArrayItem(ElementName = "Content", IsNullable = false)]
public List<DdiContent> Descriptions { get; set; }
[XmlAttribute(AttributeName = "missing")]
public bool Missing { get; set; }
public DdiCategory()
{
Type = DomainObjectType.Category;
Descriptions = new List<DdiContent>();
}
}
Reusable namespace:
Obviously a problem is the ambiguity with the two descriptions. I tried to figure it out how could I solve it with xml attributes but so far no luck.
If anybody have an idea please feel free to share =)
Cheers!
I managed to figure it out. The problem was in DdiCategory class the description property had a wrong type. That type should be StructuredStringType and not DdiContent. After this I could eliminate the xml attributes.

How to create an array of records in BizTalk

I have an xsd type which consists of some elements. One of the elements is defined like
<xs:element name="Parameters" type="ParametersType" /> where ParametersType is
<xs:complexType name="ParametersType">
<xs:sequence>
<xs:element name="Parameter"
type="ParameterType"
minOccurs="0"
maxOccurs="unbounded" />
<xs:element name="UserDefinedParameter"
type="xs:base64Binary"
minOccurs="0"
maxOccurs="1">
</xs:element>
</xs:sequence>
</xs:complexType>
That is, I have an array of Parameter type records. So I have 2 questions so far:
Ноw to initialize such array and how to work with it in Expression block;
How to tune mapping from incoming message of the same type to my message?
When we talk about arrays here we are really talking about nested, repeatable nodes within your message.
One solution is to decompose your array inside a loop in your orchestration.
This is not simple, but here is an example:
The code inside the various expression shapes:
Inside "Count array items"
intCountArrayItems = xpath(MyMessage, "count(XpathToParameterNodeInYourMessage)");
Inside "foreach array item"
intLoopIndex < intCountArrayItems
Inside "Use array item"
strXPathToArrayItem = System.String.Format("XpathToParameterNodeInYourMessage[{0}]", intLoopIndex + 1);
MyXmlDocument = xpath(MyMessage, strXPathToArrayItem);
// Now you can do what you want with the xml document.
Inside "Increment loop index"
intLoopIndex = intLoopIndex + 1;
The above gives you a way to decompose an array inside your orchestration and access each of your "Paramter" types as an xml document (which you can then do stuff with).
Hope this helps.

xsd sequence of any type of element that is an extension of specific complex type

Basically if this was .NET, it would look like this:
ISomething
{
string A { get; }
int B { get; }
}
var somethings = new List<ISomething>();
something.Add(new SomethingSomething());
something.Add(new AnotherSomething());
something.Add(new AnythingSomething());
Basically I want the sequence of elements to be named anything they want to be, as long as their complex type is an extension of a complex type I define.
So it may look something like:
<somethings>
<something-something a="foo" b="0" />
<another-something a="bar" b="1" />
<example:anything-something a="baz" b="2" />
</somethings>
I'm sure this is possible, the alternative I guess is composition, where I have a standard element that can contain a single child that is at least a 'Something'..
Thanks in advance, xsd isn't my strong point.
Edit, ok the closest thing I've found so far is basically:
<somethings>
<something xsi:type="something-something" a="foo" b="0" />
<something xsi:type="another-something" a="bar" b="1" />
<something xsi:type="example:anything-something" a="baz" b="2" />
</somethings>
I guess this is the only way this is handled? if so this isn't so bad, and vs intellisense seems to understand this well enough.
Thanks.
This is a good question. You could do a sequence of "any", which would allow you have arbitrarily named elements inside - but that won't constrain them in any way. Alternately, the schema below constrains the name and the attributes, but nothing else (as in your second example)
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="somethingsType" >
<xs:complexContent>
<xs:restriction base="xs:anyType">
<xs:attribute name="a" type="xs:string"/>
<xs:attribute name="b" type="xs:string"/>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="somethingsSeq" >
<xs:sequence>
<xs:element name="something" type="somethingsType"/>
</xs:sequence>
</xs:complexType>
<xs:element name="somethings" type="somethingsSeq"/>
</xs:schema>
I can't find a way to constrain the type but not the element name.

Resources