Related: XSD 1.1 compare 2 dates
Here's my XML schema snippet:
<xs:complexType name="headerType">
<xs:sequence>
<xs:element name="ContentDate" type="dateTime" />
<xs:element minOccurs="0" name="DeltaStart" type="lei:LEIDateTimeProfile" />
</xs:sequence>
<xs:assert test="empty(dateTime(./DeltaStart) gt dateTime(./ContentDate))" />
</xs:complexType>
<xs:element name="header" type="headerType" />
Any ideas why the following XML snippet is causing a validation error?
<header>
<ContentDate>2017-02-01T12:00:00Z</ContentDate>
<DeltaStart>2017-02-01T12:00:00Z</DeltaStart>
</header>
Here's the error message:
Assertion evaluation ('emtpy(dateTime(./DeltaStart) gt dateTime(./ContentDate))') for element 'LEIHeader' on schema type 'LEIHeaderType' did not succeed.
XPST0017 - Function does not exist: emtpy arity: 1.
My guess would be that you misspelled "empty" as "emtpy". Either that, or it's a very strange error message.
(But applying the empty() function to the result of a "gt" comparison also seems a bit... shall we say quirky?)
Related
I wrote a number of assertions to compare pairs of dates in XSD 1.1 but none of them work.
Examples:
INPUT
<Records content-date="2006-05-04T18:13:51.0Z">
<Record issuance-date="2006-05-04T18:13:51.0Z"
last-update-date="2006-05-04T18:13:51.0Z"
last-renewal-date="2006-05-04T18:13:51.0Z" >
</Record>
<Record issuance-date="2006-05-04T18:13:51.0Z"
last-update-date="2006-05-04T18:13:51.0Z" last-renewal-date="2006-05-04T18:13:51.0Z">
<Event event-date="2006-05-04T18:13:51.0Z" event-type="INITIAL_REGISTRATION">
</Event>
</Record>
</Records>
XSD 1.1 asserts:
<xs:assert id="plausibility-issuance-date-plausibility"
test="#issuance-date < ./#content-date"/>
and
<xs:assert id="plausibility-file-and-record-timezones"
test="timezone-from-dateTime(Record/#issuance-date) = timezone-from-dateTime(REcords#content-date)"/>
Having read up on dateTime and timezone representations I'm a little overwhelmed.
Can anyone please tell me:
where are the errors (I hope it's clear what I'm trying to compare)?
is there a set of simple examples of this kind that make it easier to follow?
Your xs:assert XPATH its not correct because it is assumming that issuance-date and content-date are attributes of the same element, but they are not.
You can use an assert with this sample XPATH to say that "there is no Record with issuance-date greater or equal than its parent content-date":
empty(Record[#issuance-date ge ../#content-date])
Example XSD:
<xs:element name="Records">
<xs:complexType>
<xs:sequence>
<xs:element name="Record" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="issuance-date" type="xs:dateTime"/>
<xs:attribute name="last-update-date" type="xs:dateTime"/>
<xs:attribute name="last-renewal-date" type="xs:dateTime"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="content-date" type="xs:dateTime"/>
<xs:assert id="plausibility-issuance-date-plausibility" test="empty(Record[#issuance-date ge ../#content-date])"/>
</xs:complexType>
</xs:element>
I was using XSD to validate my incoming XML elements.
XSD File
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.rg/2001/XMLSchema"
xmlns:tns="http://xxxy/ervices/V0"
targetNamespace="http://xxxy/ervices/V" elementFormDefault="qualified"
attributeFormDefault="unqualified" >
<xs:complexType name="FailType">
<xs:sequence>
<xs:element name="ConDt" type="xs:date" minOccurs="0" maxOccurs="1" nillable="true"/>
<xs:element name="PreEn" type="xs:string" minOccurs="1" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
My XML File
<Pat xmlns="http://xxxy/ervices/V">
<ConDt></ConDt>
</Pat>
I was getting element is invalid - The value '' is invalid according to its datatype 'http://org/2001/XMLSchema:date' - The string '' is not a valid Date value.
Specifying nillable="true" allows your instance to contain
<ConDt xsi:nil="true"></ConDt>
but it doesn't allow you to write
<ConDt></ConDt>
(Please don't ask me what they were thinking...)
If you want to allow
<ConDt></ConDt>
Then two possible approaches are
define it as a union type that allows either an xs:date or a
zero-length string, or
(my preferred approach) define it as a list type: a list of xs:date values with maxLength="1".
Thanks a lot Michael. I really appreciate your help.
Below code will allow us to declare optional date field.
<xs:element name="ConDt" maxOccurs="unbounded" minOccurs="0">
<xs:simpleType>
<xs:union>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="0" />
<xs:maxLength value="0" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType>
<xs:restriction base="xs:date" />
</xs:simpleType>
</xs:union>
</xs:simpleType>
</xs:element>
I have a source schema with less elements than the destination schema. When I run the map only mapped elements in destination schema shows up. I want all the elements in destination schema to show up, even they are empty. How to do this?
Set the "Default Value" of the output schema. This will create empty nodes.
The most convenient way is to use Inline C# Scripting functoid for this.
Scripting functoid:
public string GetEmptyString()
{
return System.String.Empty;
}
You can just link this functoid to all output nodes where you wish to see empty node.
Example:
Input schema:
<xs:schema xmlns="http://person" targetNamespace="http://person" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Person">
<xs:complexType>
<xs:sequence>
<xs:element name="Name" type="xs:string" />
<xs:element name="Surname" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Output schema:
<xs:schema xmlns="http://employee"
targetNamespace="http://employee"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Employee">
<xs:complexType>
<xs:sequence>
<xs:element name="FirstName" type="xs:string" />
<xs:element name="MidName" type="xs:string" />
<xs:element name="LastName" type="xs:string" />
<xs:element name="Age" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Input message:
<ns0:Person xmlns:ns0="http://person">
<Name>John</Name>
<Surname>Snow</Surname>
</ns0:Person>
Expected output message:
<ns0:Employee xmlns:ns0="http://employee">
<FirstName>John</FirstName>
<MidName />
<LastName>Snow</LastName>
<Age />
</ns0:Employee>
Solution:
Link Person.Name to Employee.FirstName
Link Person.Surname to Employee.LastName
Create Scripting functoid that returns empty string
Link Scripting functoid to Employee.MidName
Link Scripting functoid to Employee.Age
I have a very strange behaviour in the Show Promotions Dialog in BizTalk 2006. It allows me to promote property fields:
But distinguished fields are disabled:
Any thoughts?
This is the XML Schema generated by the SQL Transport Schema Generation Wizard:
<?xml version="1.0" encoding="utf-16" ?>
<xs:schema xmlns:b="http://schemas.microsoft.com/BizTalk/2003" xmlns="http://ExecutionPlanner.InitializeStep" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://ExecutionPlanner.InitializeStep" version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:annotation>
<xs:appinfo>
<msbtssql:sqlScript value="exec [InitizializeStep] #ORCHESTRATION_NAME=" ", #PROVIDER_NAME=" ", #STEP_NAME=" "" xmlns:msbtssql="http://schemas.microsoft.com/BizTalk/2003" />
</xs:appinfo>
</xs:annotation>
<xs:element name="Step">
<xs:complexType>
<xs:sequence minOccurs="1" maxOccurs="1">
<xs:element name="OrchestrationID" type="OrchestrationIDType" />
<xs:element name="Message" type="MessageType" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="OrchestrationIDType">
<xs:simpleContent>
<xs:extension base="xs:string" />
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="MessageType">
<xs:simpleContent>
<xs:extension base="xs:string" />
</xs:simpleContent>
</xs:complexType>
</xs:schema>
Edit your schema to change the OrchestrationID field from a Record to a Field Element. Only Elements and Attributes can be distinguished.
This usually entails deleting the existing Record element, then re-creating an Element with the same name, as Visual Studio wont allow changing an xml node's type. However, you can get around this by opening the xsd file using the XML (Text) Editor using the 'Open With...' option.
Very new to .Net. Everything was working fine until I added <Tracking> to my XML file:
<Product>
<id>product1</id>
<Name>Product 1</Name>
<Packart>detailimg</Packart>
<TitleFile>detailtitleoriginal</TitleFile>
<Description>Description</Description>
<Ingredients>Ingredients</Ingredients>
<FeedingInstructions>Instructions</FeedingInstructions>
<Analysis>Analysis</Analysis>
<Footer>Footer</Footer>
**<Tracking>Test</Tracking>**
</Product>
My XSD file is such:
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Products">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="Product">
<xs:complexType>
<xs:sequence>
<xs:element name="id" type="xs:string" />
<xs:element name="Name" type="xs:string" />
<xs:element name="Packart" type="xs:string" />
<xs:element name="TitleFile" type="xs:string" />
<xs:element name="Description" type="xs:string" />
<xs:element name="Ingredients" type="xs:string" />
<xs:element name="FeedingInstructions" type="xs:string" />
<xs:element name="Analysis" type="xs:string" />
<xs:element name="Footer" type="xs:string" />
<xs:element name="Tracking" type="xs:string" /></xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Then in my aspx page I added:
<%=row[ "Tracking"]%>
When I view the page in a browser I get the error:
Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.Data.ConstraintException: Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints.
Source Error:
Line 19: ds = new System.Data.DataSet();
Line 20: ds.ReadXmlSchema(MapPath("Content/xml/Products.xsd"));
Line 21: ds.ReadXml(MapPath("Content/xml/Products.xml"));
Line 22: Cache.Insert("Products", ds, new System.Web.Caching.CacheDependency(MapPath("Content/xml/Products.xml")),
Line 23: DateTime.Now.AddHours(12), System.Web.Caching.Cache.NoSlidingExpiration);
Source File: d:\ProductDetails.aspx.cs Line: 21
One way to overcome this issue quickly is to disable EnforceConstraints on the dataset:
ds.EnforceConstraints = false;
//now you can load the data
UPDATE: This may have unwanted repercussions, obviously. You should decide whether this is the case or not in your scenario.