...
Notice the CRLFs at the end. The CRs are represented as remapped to Private-Use-Area(PUA) E00D entities.
The DFDL schema for this, including the specification of the layering transform behaviors.
...
Code Block |
---|
<xs:schema ....>
|
...
<dfdl:format separatorPosition="infix" lengthKind="boundaryMark" encoding="utf-8" occursCountKind="parsed" separator="" sequenceKind="ordered" separatorPosition="infix"/> |
...
<dfdl:defineFormat name="folded"> <dfdl:format layerTransform="foldedLines" layerLengthKind="boundaryMark" layerEncoding="us-ascii"/> <!-- boundaryMark here means to enclosing end-of-data, as no boundary mark delimiter is defined. --> </dfdl:defineFormat> <dfdl:defineFormat name="qp"> <dfdl:format layerTransform="quotedPrintable" layerLengthKind="pattern" layerLengthPattern="[^\n]*?(?=(?<!=)\n)"/> <!-- QPs are terminated by a newline that is not preceded by an =. This final newline is not consumed as part of the content. --> <!-- Alternatively, the QP transform itself can determine the length by searching for this final newline (but leaving it there). In which case the lengthKind would be "implicit" --> </dfdl:defineFormat> |
...
<xs:element name="VCalendar" dfdl:initiator="BEGIN:VCALENDAR%NL;" dfdl:terminator="END:VCALENDAR%NL; END:VCALENDAR"> <xs:complexType> <xs:sequence dfdl:separator="%NL;" dfdl:sequenceKind="unordered"> <xs:sequence dfdl:ref="tns:folded"> |
...
<xs:element name="ProdID" type="xs:string" dfdl:initiator="PRODID:" minOccurs="0"/> </xs:sequence> |
...
<xs:element name="Version" type="xs:string" dfdl:initiator="VERSION:" minOccurs="0" /> <xs:element name="VEvent" maxOccurs="unbounded" minOccurs="0" dfdl:occursCountKind="parsed" dfdl:initiator="BEGIN:VEVENT%NL;" dfdl:terminator="END:VEVENT"> <xs:complexType> <xs:sequence dfdl:separator="%NL;" dfdl:sequenceKind="unordered"> <xs:element name="DTStart" type="xs:string" dfdl:initiator="DTSTART:" /> <xs:element name="DTEnd" type="xs:string" dfdl:initiator="DTEND:" /> <!-- content from here could have long lines, so must be folded --> <xs:sequence dfdl:ref="tns:folded"> <xs:element name="Location" type="xs:string" dfdl:initiator="LOCATION:" minOccurs="0"/> <xs:element name="UID" type="xs:string" dfdl:initiator="UID:" minOccurs="0"/> |
...
<xs:element name="Description" dfdl:initiator="DESCRIPTION:" minOccurs="0"> <xs:complexType> <xs:sequence> <xs:element name="Encoding" type="xs:string" dfdl:initiator="ENCODING=" dfdl:terminator=":" minOccurs="0" /> <xs:choice dfdl:choiceDispatchKey="{ if (fn:exists(./Encoding)) then ./Encoding else '' }"> <!-- we inspect the value of the Encoding element and decide what branch of the choice based on it --> <xs:sequence dfdl:choiceBranchKey="QUOTED-PRINTABLE"> dfdl:separator="" dfdl:sequenceKind="unordered"> <!-- Each branch starts with a distinct dummy element to satisfy the UPA rules of XML Schema --> <xs:element name="QP" type="xs:string" dfdl:inputValueCalc="{ '' }" /> <!-- Here notice tha tthe layerRef for the qp data is scoped to just this inner element. --> <xs:sequence dfdl:ref="tns:qp"> |
...
<xs:element name="Value" type="xs:string"/> |
...
</xs:sequence><!-- end layer quoted printable --> </xs:sequence> |
...
<!-- repeat the above pattern for the choice branches for the various encodings --> </xs:choice> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="Summary" type="xs:string" dfdl:initiator="SUMMARY:" minOccurs="0"/> <xs:element name="Priority" type="xs:string" dfdl:initiator="PRIORITY:" minOccurs="0" /> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence><!-- end folded layer --> |
...
</xs:sequence> </xs:complexType> </xs:element> </xs:schema> |