The library library(sgml_write)
provides the inverse of
the parser, converting the parser's output back into a file. This
process is fairly simple for XML, but due to the power of the SGML DTD
it is much harder to achieve a reasonable generic result for SGML.
These predicates can write the output in two encoding schemas depending on the encoding of the Stream. In UTF-8 mode, all characters are encoded using UTF-8 sequences. In ISO Latin-1 mode, characters outside the ISO Latin-1 range are represented using a named character entity if provided by the DTD or a numeric character entity.
false
, the XML header is suppressed.
Useful for embedding in other XML streams.false
,
no layout characters are added. As this mode does not need to analyse
the document it is faster and guarantees correct output when read back.
Unfortunately the output is hardly human readable and causes problems
with many editors.header
and
ident
is added to use xml_write/3
to generate XML that is embedded in a larger XML document.<foo/>
(default,
net(true)
) or <foo></foo>
(net(false)
).
For SGML, this applies to empty elements, so you get <foo>
(if foo is declared to be EMPTY
in the DTD),
<foo></foo>
(default, net(false)
)
or
<foo//
(net(true)
). In SGML code, short
character content not containing /
can be
emitted as <b>xxx</b>
(default, net(false)
or <b/xxx/
(net(true)
)DOCTYPE
header and the content of the
document as represented by Term to Stream. The Options
are described with xml_write/3.
In most cases, the preferred way to create an XML document is to
create a Prolog tree of element(Name, Attributes, Content)
terms and call xml_write/3
to write this to a stream. There are some exceptions where one might not
want to pay the price of the intermediate representation. For these
cases, this library contains building blocks for emitting markup data.
The quote funtions return a version of the input text into one that
contains entities for characters that need to be escaped. These are the
XML meta characters and the characters that cannot be expressed by the
document encoding. Therefore these predicates accept an encoding
argument. Accepted values are ascii
,
iso_latin_1
, utf8
and unicode
.
Versions with two arguments are provided for backward compatibility,
making the safe
ascii
encoding assumption.
<>&"
.4Older
versions also mapped ’
to '
.
Characters that cannot represented in Encoding are mapped to
XML character entities.ascii
encoding.ascii
encoding.ascii
encoding.
The predicates in this section translate between values and their lexical forms for XML-Schema data types. They are implementated in C to achieve the best possible performance.
NaN
and INF
. If a Prolog float is converted into a string it
returns the XML canonical form. This form always has one digit before
the decimal dot, at least one digit after it and an exponential
component using the capital
E
. This predicate behaves as number_string/2
for integers.
Throws a syntax_error(xsd_number)
if String
is given and is not a well-formed XSD number.
Prolog term | Type | XSD string |
date(Y,M,D) | xsd:date | YYYY-MM-DD |
date_time(Y,M,D,H,Mi,S) | xsd:dateTime | YYYY-MM-DDTHH:MM:SS |
date_time(Y,M,D,H,Mi,S,0) | xsd:dateTime | YYYY-MM-DDTHH:MM:SSZ |
date_time(Y,M,D,H,Mi,S,TZ) | xsd:dateTime | YYYY-MM-DDTHH:MM:SS[+-]HH:MM |
time(H,M,S) | xsd:time | HH:MM:SS |
year_month(Y,M) | xsd:gYearMonth | YYYY-MM |
month_day(M,D) | xsd:gMonthDay | MM-DD |
D | xsd:gDay | DD |
M | xsd:gMonth | MM |
Y | xsd:gYear | YYYY |
For the Prolog term all variables denote integers except for
S, which represents seconds as either an integer or float.
The
TZ argument is the offset from UTC in seconds. The
Type is written as xsd:name, but is in fact the
full URI of the XSD data type, e.g., http://www.w3.org/2001/XMLSchema#date
.
In the XSD string notation, the letters YMDHS denote digits. The
notation SS is either a two-digit integer or a decimal number with two
digits before the floating point, e.g. 05.3
to denote 5.3
seconds.
For most conversions, Type may be specified unbound and is
unified with the resulting type. For ambiguous conversions, Type
must be specified or an instantiation_error is raised. When converting
from Prolog to XSD serialization, D, M and Y are ambiguous. When
convertion from XSD serialization to Prolog, only DD and MM are
ambiguous. If
Type and String are both given and String
is a valid XSD date/time representation but not matching Type
a syntax error with the shape syntax_error(Type)
is raised.
If DateTime and Type are both given and DateTime
does not satisfy
Type a domain_error of the shape
domain_error(xsd_time(Type), DateTime)
is raised.
The domain of numerical values is verified and a corresponding
domain_error exception is raised if the domain is violated. There is no
test for the existence of a date and thus "2016-02-31"
,
although non-existing is accepted as valid.
C14n2 specifies a canonical XML document. This library writes such a document from an XML DOM as returned by the XML (or SGML) parser. The process takes two steps:
xmlns
and the option keep_prefix(true)
.