GenX is a ShEx extension to leverage ShEx's unambiguous, ordered traversal of RDF graphs to produce XML documents.
from the ShEx Demo (look for [Popup] or link in validation messages):
#BASE <http://base.example/#>
PREFIX ex: <http://ex.example/#>
PREFIX foaf: <http://xmlns.com/foaf/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX GenX: <http://shexspec.github.io/extensions/GenX/>
# directives:
# =<function>?
# $<namespace>
# !debugger
%GenX:{ issue $http://ex.example/xml %}
start = <IssueShape>
<IssueShape> {
ex:state (ex:unassigned ex:assigned) %GenX:{ @state =substr(19) %},
ex:reportedBy @<Person> %GenX:{ reported = %},
ex:reportedOn xsd:dateTime %GenX:{ [-1]@date %},
(ex:reproducedBy @<EmployeeShape> ,
ex:reproducedOn xsd:dateTime %GenX:{ @date %}
)? %GenX:{ reproduced = %},
ex:related @<IssueShape>*
} %GenX:{ @id %}
VIRTUAL <Person> {
(foaf:name xsd:string %GenX:{ full-name %}
| foaf:givenName xsd:string+ %GenX:{ given-name %},
foaf:familyName xsd:string %GenX:{ family-name %}
),
foaf:mbox IRI %GenX:{ email-addr %}
}
<UserShape> & <Person> {
}
<EmployeeShape> {
& <Person>,
foaf:phone IRI+ %GenX:{ tel-number %}
}
#BASE <http://base.example/#>
PREFIX ex: <http://ex.example/#>
PREFIX foaf: <http://xmlns.com/foaf/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
<Issue1>
ex:state ex:unassigned ;
ex:reportedBy <User2> ;
ex:reportedOn "2013-01-23T10:18:00"^^xsd:dateTime ;
ex:reproducedBy <Thompson.J> ;
ex:reproducedOn "2013-01-23T11:00:00"^^xsd:dateTime ;
# ex:related <Issue2>, <Issue3>
.
<User2>
foaf:givenName "Bob" ;
foaf:familyName "Smith" ;
foaf:mbox <mailto:bob@example.org>
.
<Thompson.J>
foaf:givenName "Joe", "Joseph" ;
foaf:familyName "Thompson" ;
foaf:phone <tel:+456> ;
foaf:mbox <mailto:joe@example.org>
.
<issue xmlns="http://ex.example/xml" id="Issue1" state="unassigned"> <reported date="2013-01-23T10:18:00"> <given-name>Bob</given-name> <family-name>Smith</family-name> <email-addr>mailto:bob@example.org</email-addr> </reported> <reproduced date="2013-01-23T11:00:00"> <given-name>Joe</given-name> <given-name>Joseph</given-name> <family-name>Thompson</family-name> <email-addr>mailto:joe@example.org</email-addr> <tel-number>tel:+456</tel-number> </reproduced> </issue>