Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Stephane Crozat
hdoc
Commits
d148847a
Commit
d148847a
authored
Dec 07, 2015
by
lhommeni
Browse files
Resolution probleme hdoc_to_opale
parent
728ed4c2
Changes
74
Expand all
Hide whitespace changes
Inline
Side-by-side
wikipedia_to_hdoc/hdoc_to_opale/.wspmeta
0 → 100644
View file @
d148847a
This diff is collapsed.
Click to expand it.
wikipedia_to_hdoc/hdoc_to_opale/addCourseUcIds.xsl
0 → 100644
View file @
d148847a
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:h=
"http://www.utc.fr/ics/hdoc/xhtml"
xmlns:xsl=
"http://www.w3.org/1999/XSL/Transform"
version=
"1.0"
xmlns:sc=
"http://www.utc.fr/ics/scenari/v3/core"
xmlns:op=
"utc.fr:ics/opale3"
xmlns:sp=
"http://www.utc.fr/ics/scenari/v3/primitive"
>
<xsl:output
method=
"xml"
indent=
"yes"
encoding=
"UTF-8"
/>
<xsl:template
match=
"@*|node()"
>
<xsl:copy>
<xsl:apply-templates
select=
"@*|node()"
/>
</xsl:copy>
</xsl:template>
<xsl:template
name=
"string-to-lowercase"
>
<xsl:param
name=
"lcletters"
>
abcdefghijklmnopqrstuvwxyzeeeeaaaa
</xsl:param>
<xsl:param
name=
"ucletters"
>
ABCDEFGHIJKLMNOPQRSTUVWXYZéèêëàâàá
</xsl:param>
<xsl:param
name=
"text"
/>
<xsl:value-of
select=
"translate($text,$ucletters,$lcletters)"
/>
</xsl:template>
<xsl:template
name=
"string-to-slug"
>
<xsl:param
name=
"text"
select=
"''"
/>
<xsl:variable
name=
"dodgyChars"
select=
"' ,.#_-!?*:;=+' "
/>
<xsl:variable
name=
"replacementChar"
select=
"'-------------'"
/>
<xsl:variable
name=
"oneline"
>
<xsl:value-of
select=
"normalize-space(translate($text,' ',''))"
/>
</xsl:variable>
<xsl:variable
name=
"lowercased"
><xsl:call-template
name=
"string-to-lowercase"
><xsl:with-param
name=
"text"
select=
"$oneline"
/></xsl:call-template></xsl:variable>
<xsl:variable
name=
"escaped"
><xsl:value-of
select=
"translate( $lowercased, $dodgyChars, $replacementChar )"
/></xsl:variable>
<xsl:variable
name=
"cleaned"
>
<xsl:call-template
name=
"string-replace-caller"
>
<xsl:with-param
name=
"text"
select=
"$escaped"
/>
<xsl:with-param
name=
"replace"
select=
"'---'"
/>
<xsl:with-param
name=
"by"
select=
"'-'"
/>
</xsl:call-template>
</xsl:variable>
<xsl:value-of
select=
"$cleaned"
/>
</xsl:template>
<xsl:template
name=
"string-replace-all"
>
<xsl:param
name=
"text"
/>
<xsl:param
name=
"replace"
/>
<xsl:param
name=
"by"
/>
<xsl:choose>
<xsl:when
test=
"contains($text,$replace)"
>
<xsl:value-of
select=
"substring-before($text,$replace)"
/>
<xsl:value-of
select=
"$by"
/>
<xsl:call-template
name=
"string-replace-all"
>
<xsl:with-param
name=
"text"
select=
"substring-after($text,$replace)"
/>
<xsl:with-param
name=
"replace"
select=
"$replace"
/>
<xsl:with-param
name=
"by"
select=
"$by"
/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of
select=
"$text"
/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template
name=
"string-replace-caller"
>
<xsl:param
name=
"text"
/>
<xsl:param
name=
"replace"
/>
<xsl:param
name=
"by"
/>
<xsl:variable
name=
"changed"
>
<xsl:choose>
<xsl:when
test=
"contains($text,$replace)"
>
<xsl:call-template
name=
"string-replace-all"
>
<xsl:with-param
name=
"text"
select=
"$text"
/>
<xsl:with-param
name=
"replace"
select=
"$replace"
/>
<xsl:with-param
name=
"by"
select=
"$by"
/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of
select=
"$text"
/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:choose>
<xsl:when
test=
"contains($changed,$replace)"
>
<xsl:call-template
name=
"string-replace-caller"
>
<xsl:with-param
name=
"text"
select=
"$changed"
/>
<xsl:with-param
name=
"replace"
select=
"$replace"
/>
<xsl:with-param
name=
"by"
select=
"$by"
/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of
select=
"$changed"
/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template
match=
"sp:courseUc"
>
<sp:courseUc>
<xsl:variable
name=
"slug"
>
<xsl:call-template
name=
"string-to-slug"
>
<xsl:with-param
name=
"text"
select=
"op:expUc/op:uM/sp:title"
/>
</xsl:call-template>
</xsl:variable>
<xsl:variable
name=
"id"
>
<xsl:value-of
select=
"count(preceding::sp:courseUc[not(preceding::sp:courseUc= .)])+1"
/>
<xsl:text>
-
</xsl:text>
<xsl:value-of
select=
"$slug"
/>
</xsl:variable>
<xsl:attribute
name=
"data-export-id"
>
<xsl:text>
uoc-
</xsl:text>
<xsl:value-of
select=
"$id"
/>
</xsl:attribute>
<xsl:attribute
name=
"data-export-file"
>
unit-
<xsl:value-of
select=
"$id"
/>
.xml
</xsl:attribute>
<xsl:apply-templates
select=
"@*|node()"
/>
</sp:courseUc>
</xsl:template>
</xsl:stylesheet>
\ No newline at end of file
wikipedia_to_hdoc/hdoc_to_opale/addCourseUcReferences.xsl
0 → 100644
View file @
d148847a
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:h=
"http://www.utc.fr/ics/hdoc/xhtml"
xmlns:xsl=
"http://www.w3.org/1999/XSL/Transform"
version=
"1.0"
xmlns:sc=
"http://www.utc.fr/ics/scenari/v3/core"
xmlns:op=
"utc.fr:ics/opale3"
xmlns:sp=
"http://www.utc.fr/ics/scenari/v3/primitive"
>
<xsl:output
method=
"xml"
indent=
"yes"
encoding=
"UTF-8"
/>
<xsl:template
match=
"@*|node()"
>
<xsl:copy>
<xsl:apply-templates
select=
"@*|node()"
/>
</xsl:copy>
</xsl:template>
<xsl:template
match=
"sp:courseUc"
>
<sp:courseUc>
<xsl:attribute
name=
"sc:refUri"
>
<xsl:value-of
select=
"@data-export-file"
/>
</xsl:attribute>
</sp:courseUc>
</xsl:template>
</xsl:stylesheet>
\ No newline at end of file
wikipedia_to_hdoc/hdoc_to_opale/copyCourseUc.xsl
0 → 100644
View file @
d148847a
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:h=
"http://www.utc.fr/ics/hdoc/xhtml"
xmlns:xsl=
"http://www.w3.org/1999/XSL/Transform"
version=
"1.0"
xmlns:sc=
"http://www.utc.fr/ics/scenari/v3/core"
xmlns:op=
"utc.fr:ics/opale3"
xmlns:sp=
"http://www.utc.fr/ics/scenari/v3/primitive"
>
<xsl:output
method=
"xml"
indent=
"yes"
encoding=
"UTF-8"
/>
<!-- The ID of the courseUc element that needs to be copied has to be passed here -->
<!--MODIFICATION NICOLAS<xsl:param name="elementid" xsl:required="yes" xsl:as="xsl:string"/>-->
<xsl:param
name=
"elementid"
/>
<xsl:template
match=
"sc:item"
>
<xsl:apply-templates
select=
".//sp:courseUc"
/>
</xsl:template>
<xsl:template
match=
"sp:courseUc[@data-export-id = $elementid]"
>
<sc:item>
<!-- Once we are in the right courseUc, we can just copy everything -->
<xsl:copy-of
select=
"./*"
/>
</sc:item>
</xsl:template>
<xsl:template
match=
"*"
/>
</xsl:stylesheet>
\ No newline at end of file
wikipedia_to_hdoc/hdoc_to_opale/global.properties
0 → 100644
View file @
d148847a
tmpdir
=
tmp
OutputPathDivided
=
divided.scar
OutputPath
=
out.scar
\ No newline at end of file
wikipedia_to_hdoc/hdoc_to_opale/hdoc_to_opale.ant
0 → 100644
View file @
d148847a
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project
name=
"hdoc_to_opale"
basedir=
"."
default=
"convert"
>
<property
file=
"global.properties"
/>
<taskdef
name=
"jing"
classname=
"com.thaiopensource.relaxng.util.JingTask"
>
<classpath>
<pathelement
location=
"lib/jing.jar"
/>
</classpath>
</taskdef>
<target
name=
"convert"
>
<!-- This is the main target : it is called whether by the project (as the default target) or by the user/converter
website, if specified in the command line. Basically, this target consists in several targets/ant buildfiles calls. -->
<antcall
target=
"CleanDirectory"
/>
<mkdir
dir=
"${tmpdir}"
/>
<antcall
target=
"UnzipHdocFile"
/>
<antcall
target=
"validateInput"
/>
<antcall
target=
"FindContentFiles"
/>
<ant
antfile=
"${tmpdir}/generateContentPath.xml"
/>
<antcall
target=
"ValidateOutput"
/>
<antcall
target=
"DivideOutput"
/>
<antcall
target=
"ZipOutput"
/>
<antcall
target=
"ZipDividedOutput"
/>
<antcall
target=
"CleanDirectory"
/>
</target>
<target
name=
"CleanDirectory"
>
<delete
dir=
"${tmpdir}"
/>
</target>
<target
name=
"UnzipHdocFile"
>
<!-- Unzip the input hdoc file. Decompressed folder is named "decompressedHdoc" : this name is the only one which
refers to the hdoc file furthermore in this project. -->
<unzip
src=
"${InputPath}"
dest=
"${tmpdir}/decompressedHdoc"
/>
<chmod
dir=
"${tmpdir}/decompressedHdoc"
perm=
"777"
/>
</target>
<target
name=
"FindContentFiles"
>
<!-- Finds the absolute path of container.xml and applies transformation0.xsl on it.-->
<first
id=
"first"
>
<fileset
dir=
"${tmpdir}/decompressedHdoc/META-INF"
includes=
"**/container.xml"
/>
</first>
<xslt
in=
"${toString:first}"
out=
"${tmpdir}/generateContentPath.xml"
style=
"transformation0.xsl"
processor=
"org.apache.tools.ant.taskdefs.optional.TraXLiaison"
/>
<chmod
file=
"${tmpdir}/generateContentPath.xml"
perm=
"777"
/>
</target>
<target
name=
"ZipOutput"
>
<copy
file=
".wspmeta"
todir=
"${tmpdir}/decompressedOpale"
/>
<mkdir
dir=
"${tmpdir}/decompressedOpale/res"
/>
<ant
antfile=
"${tmpdir}/moveRessourceFiles.xml"
/>
<zip
basedir=
"${tmpdir}/decompressedOpale"
destfile=
"${OutputPath}"
encoding=
"UTF-8"
/>
</target>
<target
name=
"ZipDividedOutput"
>
<copy
file=
".wspmeta"
todir=
"${tmpdir}/decompressedOpaleDivided"
/>
<copy
todir=
"${tmpdir}/decompressedOpaleDivided/res"
>
<fileset
dir=
"${tmpdir}/decompressedOpale/res"
includes=
"**"
/>
</copy>
<zip
basedir=
"${tmpdir}/decompressedOpaleDivided"
destfile=
"${OutputPathDivided}"
encoding=
"UTF-8"
/>
</target>
<!-- Validating the XML container file -->
<target
name=
"validateInput"
>
<jing
file=
"${tmpdir}/decompressedHdoc/META-INF/container.xml"
rngfile=
"schema/hdoc1-container.rng"
></jing>
</target>
<!-- Validating the XML output -->
<target
name=
"ValidateOutput"
>
<jing
file=
"${tmpdir}/decompressedOpale/main.xml"
rngfile=
"schema/op_ue.rng"
></jing>
</target>
<target
name=
"DivideOutput"
>
<mkdir
dir=
"${tmpdir}/decompressedOpaleDivided"
/>
<!-- Adding IDS to the general output file -->
<xslt
in=
"${tmpdir}/decompressedOpale/main.xml"
out=
"${tmpdir}/outputWithCourseUcIds.xml"
style=
"addCourseUcIds.xsl"
processor=
"org.apache.tools.ant.taskdefs.optional.TraXLiaison"
/>
<!-- Generating the root file (with refs to other files) -->
<xslt
in=
"${tmpdir}/outputWithCourseUcIds.xml"
out=
"${tmpdir}/decompressedOpaleDivided/main.xml"
style=
"addCourseUcReferences.xsl"
processor=
"org.apache.tools.ant.taskdefs.optional.TraXLiaison"
/>
<!-- Generating the ANT file that will copy the files -->
<xslt
in=
"${tmpdir}/outputWithCourseUcIds.xml"
out=
"${tmpdir}/exportUnits.ant"
style=
"prepareCourseUcCopies.xsl"
processor=
"org.apache.tools.ant.taskdefs.optional.TraXLiaison"
/>
<!-- Executing that ANT file -->
<ant
antfile=
"${tmpdir}/exportUnits.ant"
/>
</target>
</project>
wikipedia_to_hdoc/hdoc_to_opale/lib/jing.jar
0 → 100644
View file @
d148847a
File added
wikipedia_to_hdoc/hdoc_to_opale/moveRessourceFiles.xsl
0 → 100644
View file @
d148847a
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:h=
"http://www.utc.fr/ics/hdoc/xhtml"
xmlns:xsl=
"http://www.w3.org/1999/XSL/Transform"
version=
"1.0"
>
<!--CHANGEMENT NICOLAS <property file="global.properties"/>-->
<xsl:output
method=
"xml"
indent=
"yes"
encoding=
"UTF-8"
/>
<!-- This template matches the root and create a ANT project, the root of any ANT buildfile. -->
<xsl:template
match=
"h:html"
>
<project
name=
"moveRessourceFiles"
basedir=
"."
default=
"moveRessourceFiles"
>
<property
file=
"global.properties"
/>
<target
name=
"moveRessourceFiles"
>
<xsl:apply-templates
select=
"./*"
/>
</target>
</project>
</xsl:template>
<!-- These templates guides XSL's motor. -->
<xsl:template
match=
"h:body"
>
<xsl:apply-templates
select=
"./h:section"
/>
</xsl:template>
<xsl:template
match=
"h:section"
>
<xsl:apply-templates
select=
"./h:section | ./h:div"
/>
</xsl:template>
<xsl:template
match=
"h:div"
>
<xsl:apply-templates
select=
"./h:img | ./h:audio | ./h:video | ./h:object"
/>
</xsl:template>
<!-- Targeted markups. -->
<xsl:template
match=
"h:img"
>
<copy
tofile=
"${{tmpdir}}/decompressedOpale/res/{./@src}"
file=
"${{tmpdir}}/decompressedHdoc/{./@src}"
/>
</xsl:template>
<xsl:template
match=
"h:audio"
>
<copy
tofile=
"${{tmpdir}}/decompressedOpale/res/{./@src}"
file=
"${{tmpdir}}/decompressedHdoc/{./@src}"
/>
</xsl:template>
<xsl:template
match=
"h:video"
>
<copy
tofile=
"${{tmpdir}}/decompressedOpale/res/{./@src}"
file=
"${{tmpdir}}/decompressedHdoc/{./@src}"
/>
</xsl:template>
<xsl:template
match=
"h:object"
>
<copy
tofile=
"${{tmpdir}}/decompressedOpale/res/{./@data}"
file=
"${{tmpdir}}/decompressedHdoc/{./@data}"
/>
</xsl:template>
<!-- These markups are matched in order to minimize "apply-templates" side-effects (i.e. their contents are not relevant for this transformation). -->
<xsl:template
match=
"h:head"
/>
<xsl:template
match=
"h:p"
/>
<xsl:template
match=
"h:em"
/>
<xsl:template
match=
"h:i"
/>
<xsl:template
match=
"h:span"
/>
<xsl:template
match=
"h:a"
/>
<xsl:template
match=
"h:ul"
/>
<xsl:template
match=
"h:ol"
/>
<xsl:template
match=
"h:li"
/>
<xsl:template
match=
"h:table"
/>
</xsl:stylesheet>
\ No newline at end of file
wikipedia_to_hdoc/hdoc_to_opale/prepareCourseUcCopies.xsl
0 → 100644
View file @
d148847a
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:h=
"http://www.utc.fr/ics/hdoc/xhtml"
xmlns:xsl=
"http://www.w3.org/1999/XSL/Transform"
version=
"1.0"
xmlns:sc=
"http://www.utc.fr/ics/scenari/v3/core"
xmlns:op=
"utc.fr:ics/opale3"
xmlns:sp=
"http://www.utc.fr/ics/scenari/v3/primitive"
>
<xsl:output
method=
"xml"
indent=
"yes"
encoding=
"UTF-8"
/>
<xsl:template
match=
"sc:item"
>
<project
name=
"copy-ucs"
default=
"main"
>
<taskdef
name=
"jing"
classname=
"com.thaiopensource.relaxng.util.JingTask"
>
<classpath>
<pathelement
location=
"lib/jing.jar"
/>
</classpath>
</taskdef>
<property
file=
"global.properties"
/>
<target
name=
"main"
>
<xsl:apply-templates
select=
".//sp:courseUc"
/>
</target>
</project>
</xsl:template>
<xsl:template
match=
"sp:courseUc"
>
<xslt
in=
"${{tmpdir}}/outputWithCourseUcIds.xml"
out=
"${{tmpdir}}/decompressedOpaleDivided/{@data-export-file}"
style=
"copyCourseUc.xsl"
processor=
"org.apache.tools.ant.taskdefs.optional.TraXLiaison"
>
<param
name=
"elementid"
expression=
"{@data-export-id}"
/>
</xslt>
<jing
file=
"${{tmpdir}}/decompressedOpaleDivided/{@data-export-file}"
rngfile=
"schema/op_expUc.rng"
></jing>
</xsl:template>
</xsl:stylesheet>
\ No newline at end of file
wikipedia_to_hdoc/hdoc_to_opale/schema/hdoc1-container.rng
0 → 100644
View file @
d148847a
<?xml version="1.0" encoding="UTF-8"?>
<grammar
xmlns=
"http://relaxng.org/ns/structure/1.0"
xmlns:a=
"http://relaxng.org/ns/compatibility/annotations/1.0"
datatypeLibrary=
"http://www.w3.org/2001/XMLSchema-datatypes"
ns=
"urn:utc.fr:ics:hdoc:container"
>
<a:documentation>
This schema describes the META-INF/container.xml file for hdoc format
</a:documentation>
<a:documentation>
This schema is a derivation of http://www.idpf.org/epub/30/schema/ocf-container-30.rnc
from EPUB Open Container Format (http://www.idpf.org/epub/30/spec/epub30-ocf.html)
</a:documentation>
<start>
<element
name=
"container"
>
<attribute
name=
"version"
>
<value>
1.0
</value>
</attribute>
<element
name=
"rootfiles"
>
<element
name=
"rootfile"
>
<attribute
name=
"full-path"
>
<data
type=
"anyURI"
/>
</attribute>
<attribute
name=
"media-type"
>
<value>
text/xml
</value>
</attribute>
</element>
</element>
</element>
</start>
</grammar>
wikipedia_to_hdoc/hdoc_to_opale/schema/hdoc1-xhtml.rng
0 → 100644
View file @
d148847a
<?xml version="1.0" encoding="UTF-8"?>
<grammar
xmlns=
"http://relaxng.org/ns/structure/1.0"
xmlns:a=
"http://relaxng.org/ns/compatibility/annotations/1.0"
datatypeLibrary=
"http://www.w3.org/2001/XMLSchema-datatypes"
ns=
"http://www.utc.fr/ics/hdoc/xhtml"
>
<a:documentation>
This schema describes the content file for hdoc format
</a:documentation>
<a:documentation>
This schema is a restriction of XHTML (it validates XHTML
schema, if namespace is changed to http://www.w3.org/1999/xhtml)
</a:documentation>
<a:documentation>
Last update : 2014-12-04
</a:documentation>
<a:documentation>
Changes since last update :
Adding object type -> application/pdf
Adding introduction and conclusion to section header and footer
Externalizing ObjectType and VideoType (to type.rng)
</a:documentation>
<start>
<element
name=
"html"
>
<ref
name=
"Head"
/>
<ref
name=
"Body"
/>
</element>
</start>
<define
name=
"Head"
>
<element
name=
"head"
>
<!-- mandatory : document title -->
<element
name=
"title"
>
<text/>
</element>
<!-- mandatory : charset=utf-8 -->
<element
name=
"meta"
>
<attribute
name=
"charset"
>
<value>
utf-8
</value>
</attribute>
</element>
<!-- optional : hdoc source generator -->
<optional>
<element
name=
"meta"
>
<attribute
name=
"name"
>
<value>
generator
</value>
</attribute>
<attribute
name=
"content"
>
<choice>
<value>
SimpleOptim
</value>
<value>
HdocConverter/SimpleChain
</value>
<value>
SimpleChain
</value>
<value>
HdocConverter/Etherpad
</value>
<value>
HdocConverter/Opale3.4
</value>
<value>
HdocConverter/Dokiel4.0
</value>
<value>
HdocConverter/Optim1.2
</value>
<value>
HdocConverter/Topaze1.3
</value>
<value>
HdocConverter/wikipedia
</value>
<value>
HdocConverter/Wordpress
</value>
<value>
HdocConverter/OpenDocumentText
</value>
<value>
HdocConverter/LaTeX
</value>
<value>
HdocConverter/OPML
</value>
</choice>
</attribute>
</element>
</optional>
<!-- optional : metadata about content ; TODO : date...-->
<zeroOrMore>
<element
name=
"meta"
>
<attribute
name=
"name"
>
<choice>
<value>
description
</value>
<value>
keywords
</value>
<value>
author
</value>
<value>
rights
</value>
<value>
date
</value>
</choice>
</attribute>
<attribute
name=
"content"
>
<text/>
</attribute>
</element>
</zeroOrMore>
</element>
</define>
<define
name=
"Body"
>
<element
name=
"body"
>
<ref
name=
"Structure"
/>
</element>
</define>
<define
name=
"Structure"
>
<oneOrMore>
<ref
name=
"Section"
/>
</oneOrMore>
</define>
<!-- Recursive and hierachical organization of the document -->
<define
name=
"Section"
>
<element
name=
"section"
>
<!-- optional typing -->
<ref
name=
"SectionType"
/>
<!-- mandatory : title (header > h1) -->
<element
name=
"header"
>
<element
name=
"h1"
>
<text/>
</element>
<optional>
<element
name=
"div"
>
<attribute
name=
"data-hdoc-type"
>
<value>
author
</value>
</attribute>
<text/>
</element>
</optional>
<optional>
<element
name=
"div"
>
<attribute
name=
"data-hdoc-type"
>
<value>
date
</value>
</attribute>
<data
type=
"date"
/>
</element>
</optional>
<optional>
<element
name=
"div"
>
<attribute
name=
"data-hdoc-type"
>
<value>
rights
</value>
</attribute>
<text/>
</element>
</optional>
<optional>
<element
name=
"div"
>
<attribute
name=
"data-hdoc-type"
>
<value>
introduction
</value>
</attribute>
<text/>
</element>
</optional>
</element>
<!-- optional content of the section-->
<optional>
<ref
name=
"Content"
/>
</optional>
<!-- optional internal sub-structrure -->
<optional>
<ref
name=
"Structure"
/>
</optional>
<!-- optional footer -->
<optional>
<element
name=
"footer"
>
<optional>
<element
name=
"div"
>
<attribute
name=
"data-hdoc-type"
>
<value>
conclusion
</value>
</attribute>
<text/>
</element>
</optional>
<optional>
<element
name=
"div"
>
<attribute
name=
"data-hdoc-type"
>
<value>
tags
</value>
</attribute>
<oneOrMore>
<element
name=
"span"
>