Update appendix D

Signed-off-by: Lukas Jungmann <lukas.jungmann@oracle.com>
diff --git a/spec/src/main/asciidoc/XMLBinding.adoc b/spec/src/main/asciidoc/XMLBinding.adoc
index baae33a..23ebed7 100644
--- a/spec/src/main/asciidoc/XMLBinding.adoc
+++ b/spec/src/main/asciidoc/XMLBinding.adoc
@@ -21,19 +21,3 @@
 include::appG-deprecated.adoc[]
 include::appH-binary_data.adoc[]
 include::appI-changelog.adoc[]
-
-'''''
-
-[.footnoteNumber]# 29.# [[a5380]]Exception case:
-Underscore is not considered a punctuation mark for schema customization
-_<jaxb:globalBindings underscoreHandling="asCharInWord"/>_ specified in
-link:jaxb.html#a1613[See Underscore Handling]". For this
-customization, underscore is considered a special letter that never
-results in a word break as defined in link:jaxb.html#a4681[See
-XML Word Breaks] and it is definitely not considered an uncased letter.
-See example bindings in link:jaxb.html#a4755[See XML Names and
-derived Java Class, Method, and Constant Names when <jaxb:globalBindings
-underscoreHandling=”asCharInWord”>].
-
-[.footnoteNumber]# 30.# [[a5381]]Sample URN
-"urn:hl7-org:v3" \{"h17-org", "v3") transforms to \{"h17.org", "v3"}.
diff --git a/spec/src/main/asciidoc/appD-binding_xml.adoc b/spec/src/main/asciidoc/appD-binding_xml.adoc
index 423abd1..ae9c22e 100644
--- a/spec/src/main/asciidoc/appD-binding_xml.adoc
+++ b/spec/src/main/asciidoc/appD-binding_xml.adoc
@@ -3,7 +3,7 @@
 //
 
 [appendix]
-== [[a4649]]Binding XML Names to Java Identifiers
+== Binding XML Names to Java Identifiers
 
 === Overview
 
@@ -13,10 +13,9 @@
 * Model group to Java identifier
 * Namespace URI to Java package name
 
-=== [[a4656]]The Name to Identifier Mapping Algorithm
+=== The Name to Identifier Mapping Algorithm
 
-Java identifiers typically follow three
-simple, well-known conventions:
+Java identifiers typically follow three simple, well-known conventions:
 
 * Class and interface names always begin with
 an upper-case letter. The remaining characters are either digits,
@@ -42,34 +41,41 @@
 
 In order to map an arbitrary XML name into a
 Java class, method, or constant identifier, the XML name is first broken
-into a _word list_ . For the purpose of constructing word lists from XML
+into a _word list_. For the purpose of constructing word lists from XML
 names we use the following definitions:
 
-* A _punctuation character_ is one of the
-following:
-*  A hyphen (’-’, \u002D, HYPHEN-MINUS),
-*  A period (‘.’, \u002E, FULL STOP),
-*  A colon (’:’, \u003A, COLON),
-*  A dot (‘.’, \u00B7, MIDDLE DOT),
-*  \u0387, GREEK ANO TELEIA,
+* A _punctuation character_ is one of the following:
+* A hyphen (’-’, \u002D, HYPHEN-MINUS),
+* A period (‘.’, \u002E, FULL STOP),
+* A colon (’:’, \u003A, COLON),
+* A dot (‘.’, \u00B7, MIDDLE DOT),
+* \u0387, GREEK ANO TELEIA,
 * \u06DD, ARABIC END OF AYAH, or
-*  \u06DE, ARABIC START OF RUB EL HIZB.
-*  An underscore (’_’, \u005F, LOW LINE) with
-following exceptionlink:#a5380[29]
+* \u06DE, ARABIC START OF RUB EL HIZB.
+* An underscore (’\_’, \u005F, LOW LINE) with following exceptionfootnote:exc[Exception case:
+Underscore is not considered a punctuation mark for schema customization
+_<jaxb:globalBindings underscoreHandling="asCharInWord"/>_ specified in
+link:jaxb.html#a1613[See Underscore Handling]". For this
+customization, underscore is considered a special letter that never
+results in a word break as defined in link:jaxb.html#a4681[See
+XML Word Breaks] and it is definitely not considered an uncased letter.
+See example bindings in link:jaxb.html#a4755[See XML Names and
+derived Java Class, Method, and Constant Names when <jaxb:globalBindings
+underscoreHandling=”asCharInWord”>].]
 
 These are all legal characters in XML names.
 
 * A _letter_ is a character for which the
-_Character.isLetter_ method returns _true_ , _i.e._ , a letter according
+`Character.isLetter` method returns `true`, _i.e._ , a letter according
 to the Unicode standard. Every letter is a legal Java identifier
 character, both initial and non-initial.
 * A _digit_ is a character for which the
-_Character.isDigit_ method returns _true_ , _i.e._ , a digit according
+`Character.isDigit` method returns `true`, _i.e._ , a digit according
 to the Unicode Standard. Every digit is a legal non-initial Java
 identifier character.
 * A _mark_ is a character that is in none of
 the previous categories but for which the
-_Character.isJavaIdentifierPart_ method returns _true_ . This category
+`Character.isJavaIdentifierPart` method returns `true`. This category
 includes numeric letters, combining marks, non-spacing marks, and
 ignorable control characters.
 
@@ -77,112 +83,42 @@
 the above categories. We further divide letters into three
 subcategories:
 
-* An _upper-case letter_ is a letter for
-which the _Character.isUpperCase_ method returns _true_ ,
-* A _lowercase letter_ is a letter for which
-the _Character.isLowerCase_ method returns _true_ , and
-* All other letters are _uncased_ .
+* An _upper-case letter_ is a letter for which the `Character.isUpperCase` method returns `true`,
+* A _lowercase letter_ is a letter for which the `Character.isLowerCase` method returns `true`, and
+* All other letters are _uncased_.
 
 An XML name is split into a word list by
 removing any leading and trailing punctuation characters and then
-searching for _word breaks_ . A word break is defined by three regular
+searching for _word breaks_. A word break is defined by three regular
 expressions: A prefix, a separator, and a suffix. The prefix matches
 part of the word that precedes the break, the separator is not part of
 any word, and the suffix matches part of the word that follows the
 break. The word breaks are defined as:
 
-=== [[a4681]]XML Word Breaks
+.XML Word Breaks
+[cols=",,,",options="header"]
+|===
+| Prefix | Separator | Suffix | Example
+| `[^punct]` | `punct+` footnote:exc[] | `[^punct]` | `foo{vbar}--{vbar}bar`
+| `digit` | | `[^digit]` | `foo{vbar}22{vbar}bar`
+| `[^digit]` | | `digit` | `foo{vbar}22`
+| `lower` | | `[^lower]` | `foo{vbar}Bar`
+| `upper` | | `upper lower` | `FOO{vbar}Bar`
+| `letter` | | `[^letter]` | `Foo{vbar}\u2160`
+| `[^letter]` | | `letter` | `\u2160{vbar}Foo`
+| `uncased` | | `[^uncased]` |
+| `[^uncased]` | | `uncased` |
+|===
 
-Prefix
-
-Separator
-
-Suffix
-
-Example
-
-{empty}[^punct]
-
-punct+1
-
-{empty}[^punct]
-
-foo|--|bar
-
-digit
-
-
-
-{empty}[^ _digit_ ]
-
-foo|22|bar
-
-{empty}[^digit]
-
-
-
-digit
-
-foo|22
-
-lower
-
-
-
-{empty}[^lower]
-
-foo|Bar
-
-upper
-
-
-
-upper lower
-
-FOO|Bar
-
-letter
-
-
-
-{empty}[^letter]
-
-Foo|\u2160
-
-{empty}[^letter]
-
-
-
-letter
-
-\u2160|Foo
-
-uncased
-
-
-
-{empty}[^uncased]
-
-
-
-{empty}[^uncased]
-
-
-
-uncased
-
-
-
-(The character _\u2160_ is ROMAN NUMERAL ONE,
-a numeric letter.)
+(The character `\u2160` is ROMAN NUMERAL ONE, a numeric letter.)
 
 After splitting, if a word begins with a
 lower-case character then its first character is converted to upper
 case. The final result is a word list in which each word is either
 
 * A string of upper- and lower-case letters,
-the first character of which is upper case (includes underscore,’_’, for
-exception case1).
+the first character of which is upper case (includes underscore, ’_’, for
+exception casefootnote:exc[]).
 * A string of digits, or
 * A string of uncased letters and marks.
 
@@ -192,8 +128,8 @@
 * A class or interface identifier is
 constructed by concatenating the words in the list,
 * A method identifier is constructed by
-concatenating the words in the list. A prefix verb ( _get_ , _set_ ,
-_etc._ ) is prepended to the result.
+concatenating the words in the list. A prefix verb (`get`, `set`,
+_etc._) is prepended to the result.
 * A constant identifier is constructed by
 converting each word in the list to upper case; the words are then
 concatenated, separated by underscores.
@@ -206,71 +142,29 @@
 To improve user experience with default
 binding, the automated resolution of frequent naming collision is
 specified in link:jaxb.html#a4770[See Standardized Name
-Collision Resolution]“.
+Collision Resolution].
 
-=== Example
+*_Example_*
 
-=== [[a4734]]XML Names and derived Java Class, Method, and Constant Names
-
-XML Name
-
-Class Name
-
-Method Name
-
-Constant Name
-
-mixedCaseName
-
-MixedCaseName
-
-getMixedCaseName
-
-MIXED_CASE_NAME
-
-Answer42
-
-Answer42
-
-getAnswer42
-
-ANSWER_42
-
-name-with-dashes
-
-NameWithDashes
-
-getNameWithDashes
-
-NAME_WITH_DASHES
-
-other_punct-chars
-
-OtherPunctChars
-
-getOtherPunctChars
-
-OTHER_PUNCT_CHARS
-
-=== [[a4755]]XML Names and derived Java Class, Method, and Constant Names when <jaxb:globalBindings underscoreHandling=”asCharInWord”>
-
-[width="100%",cols="25%,25%,25%,25%",options="header",]
+.XML Names and derived Java Class, Method, and Constant Names
+[cols=",,,",options="header"]
 |===
-|XML Name |Class
-Name |Method Name
-|Constant Name
-|other_punct-chars
-|Other_punctChars
-|getOther_punctChars
-|OTHER_PUNCT_CHARS
-
-|name_with_underscore
-|Name_with_underscore
-|name_with_underscore
-|NAME_WITH_UNDERSCORE
+| XML Name | Class Name | Method Name | Constant Name
+| mixedCaseName | MixedCaseName | getMixedCaseName | MIXED_CASE_NAME
+| Answer42 | Answer42 | getAnswer42 | ANSWER_42
+| name-with-dashes | NameWithDashes | getNameWithDashes | NAME_WITH_DASHES
+| other_punct-chars | OtherPunctChars | getOtherPunctChars | OTHER_PUNCT_CHARS
 |===
 
-=== [[a4767]]Collisions and conflicts
+.XML Names and derived Java Class, Method, and Constant Names when <jaxb:globalBindings underscoreHandling=”asCharInWord”>
+[cols=",,,",options="header"]
+|===
+| XML Name | Class Name | Method Name | Constant Name
+| other_punct-chars | Other_punctChars | getOther_punctChars | OTHER_PUNCT_CHARS
+| name_with_underscore | Name_with_underscore | name_with_underscore | NAME_WITH_UNDERSCORE
+|===
+
+==== Collisions and conflicts
 
 It is possible that the name-mapping
 algorithm will map two distinct XML names to the same word list.These
@@ -286,25 +180,49 @@
 one of the two XML names to an alternative Java identifier.
 
 A class name must not conflict with the
-generated JAXB class, _ObjectFactory_ , link:jaxb.html#a482[See
+generated JAXB class, `ObjectFactory`, link:jaxb.html#a482[See
 Java Package], that occurs in each schema-derived Java package. Method
 names are forbidden to conflict with Java keywords or literals, with
-methods declared in _java.lang.Object_ , or with methods declared in the
+methods declared in `java.lang.Object`, or with methods declared in the
 binding-framework classes. Such conflicts are reported as errors and may
 be repaired by revising the appropriate schema or by specifying an
 appropriate customized binding that resolves the name collision.
 
-=== [[a4770]]Standardized Name Collision Resolution
+===== Standardized Name Collision Resolution
 
 Given the frequency of an XML element or
 attribute with the name “class” or “Class” resulting in a naming
-collision with the inherited method _java.lang.Object.getClass()_ ,
+collision with the inherited method `java.lang.Object.getClass()`,
 method name mapping automatically resolves this conflict by mapping
 these XML names to the java method identifier “getClazz”.
 
-* 
+[NOTE]
+.Design Note
+====
+The likelihood of collisions, and the difficulty of working around them
+when they occur, depends upon the source schema, the schema language
+in which it is written, and the binding declarations. In general, however,
+we expect that the combination of the identifier-construction rules given above,
+together with good schema-design practices, will make collisions relatively uncommon.
 
-=== [[a4773]]Deriving a legal Java identifier from an enum facet value
+The capitalization conventions embodied in the identifier-construction
+rules will tend to reduce collisions as long as names with shared mappings
+are used in schema constructs that map to distinct sorts of Java constructs.
+Anattribute named `foo` is unlikely to collide with an element type named `foo`
+because the first maps to a set of property access methods (`getFoo`, `setFoo`, _etc._)
+while the second maps to a class name (`Foo`).
+
+Good schema-design practices also make collisions less likely. When writing a schema
+it is inadvisable to use, in identical roles, names that are distinguished only by
+punctuation or case. Suppose a schema declares two attributes of a single element type,
+one named `Foo` and the other named `foo`. Their generated access methods,
+namely `getFoo` and `setFoo`, will collide. This situation would best be handled by
+revising the source schema, which would not only eliminate the collision
+but also improve the readability of the source schema and documents that use it.
+
+====
+
+=== Deriving a legal Java identifier from an enum facet value
 
 Given that an enum facet’s value is not
 restricted to an XML name, the XML Name to Java identifier algorithm is
@@ -312,19 +230,17 @@
 value. The following algorithm maps an enum facet value to a valid Java
 constant identifier name.
 
-* For each character in enum facet value, +
-copy the character to a string representation _javaId_ when
-_java.lang.Character.isJavaIdentifierPart()_ is _true_ .
-* To follow Java constant naming convention,
+* For each character in enum facet value,
+copy the character to a string representation `javaId` when
+`java.lang.Character.isJavaIdentifierPart()` is `true`.
+** To follow Java constant naming convention,
 each valid lower case character must be copied as its upper case
 equivalent.
-* There is no derived Java constant
-identifier when any of the following occur:
-*  _javaId.length() == 0_
-* 
-_java.lang.Character.isJavaIdentifierStart(javaId.get(0)) == false_
+* There is no derived Java constant identifier when any of the following occur:
+** `javaId.length() == 0`
+** `java.lang.Character.isJavaIdentifierStart(javaId.get(0)) == false`
 
-=== [[a4780]]Deriving an identifier for a model group
+=== Deriving an identifier for a model group
 
 XML Schema has the concept of a group of
 element declarations. Occasionally, it is convenient to bind the
@@ -336,34 +252,34 @@
 
 A name is computed for an unnamed model group
 by concatenating together the first 3 element declarations and/or
-wildcards that occur within the model group. Each XML \{name} is mapped
+wildcards that occur within the model group. Each XML _{name}_ is mapped
 to a Java identifier for a method using the XML Name to Java Identifier
-Mapping algorithm. Since wildcard does not have a \{name} property, it
-is represented as the Java identifier “ _Any_ ”. The Java identifiers
-are concatenated together with the separator “ _And_ ” for sequence and
-all compositor and “ _Or_ ” for choice compositors. For example, a
-sequence of element _foo_ and element _bar_ would map to _“_ _FooAndBar_
-_”_ and a choice of element _foo_ and element _bar_ maps to _“_
-_FooOrBar_ _._ ” Lastly, a sequence of wildcard and element _bar_ would
-map to the Java identifier _“_ _AnyAndBar_ _”_ .
+Mapping algorithm. Since wildcard does not have a _{name}_ property, it
+is represented as the Java identifier `"Any"`. The Java identifiers
+are concatenated together with the separator `"And"` for sequence and
+all compositor and `"Or"` for choice compositors. For example, a
+sequence of element `foo` and element `bar` would map to `"FooAndBar"`
+and a choice of element `foo` and element `bar` maps to
+`"FooOrBar"` Lastly, a sequence of wildcard and element `bar` would
+map to the Java identifier `"AnyAndBar"`.
 
-=== Example:
-
+*_Example:_* +
 Given XML Schema fragment:
 
-<xs:choice> +
-<xs:sequence> +
-<xs:element ref="A"/> +
-<xs:any processContents="strict"/> +
-</xs:sequence> +
-<xs:element ref="C"/>
-
+[source,xml,indent="2"]
+----
+<xs:choice>
+  <xs:sequence>
+    <xs:element ref="A"/>
+    <xs:any processContents="strict"/>
+  </xs:sequence>
+  <xs:element ref="C"/>
 </xs:choice>
+----
 
-The generated Java identifier would be
-_AAndAnyOrC_ .
+The generated Java identifier would be `AAndAnyOrC`.
 
-=== [[a4788]]Generating a Java package name
+=== Generating a Java package name
 
 This section describes how to generate a
 package name to hold the derived Java representation. The motivation for
@@ -376,7 +292,7 @@
 schema has no target namespace, there is a section that describes an
 algorithm to generate a Java package name from the schema filename.
 
-=== Mapping from a Namespace URI
+==== Mapping from a Namespace URI
 
 An XML namespace is represented by a URI.
 Since XML Namespace will be mapped to a Java package, it is necessary to
@@ -385,87 +301,105 @@
 
 The following steps describe how to map a URI
 to a Java package name. The example URI,
-_http://www.acme.com/go/espeak.xsd_ , is used to illustrate each step.
+`http://www.acme.com/go/espeak.xsd`, is used to illustrate each step.
 
-. Remove the scheme and _":"_ part from the
+. Remove the scheme and `":"` part from the
 beginning of the URI, if present. +
 Since there is no formal syntax to identify the optional URI scheme,
 restrict the schemes to be removed to case insensitive checks for
-schemes “ _http_ ” and “ _urn_ ”.
-
- _//www.acme.com/go/espeak.xsd_
-
-. Remove the trailing file type, one of _.??_
-or _.???_ or _.html_ .
-
- _//www.acme.com/go/espeak_
-
+schemes `"http"` and `"urn"`.
++
+[source]
+----
+//www.acme.com/go/espeak.xsd
+----
+. Remove the trailing file type, one of `.??` or `.???` or `.html`.
++
+[source]
+----
+//www.acme.com/go/espeak
+----
 . Parse the remaining string into a list of
-strings using _’/’_ and _‘:’_ as separators. Treat consecutive
+strings using `'/'` and `':'` as separators. Treat consecutive
 separators as a single separator.
-
- _\{"www.acme.com", "go", "espeak" }_
-
++
+[source]
+----
+{"www.acme.com", "go", "espeak"}
+----
 . For each string in the list produced by
 previous step, unescape each escape sequence octet.
-
- _\{"www.acme.com", "go", "espeak" }_
-
-. If the scheme is a “urn”, replace all
-dashes, “-”, occurring in the first component with
-“.”.link:#a5381[30]
++
+[source]
+----
+{"www.acme.com", "go", "espeak"}
+----
+. If the scheme is a `"urn"`, replace all
+dashes, `"-"`, occurring in the first component with
+`"."`.footnote:[Sample URN
+"urn:hl7-org:v3" {"h17-org", "v3"} transforms to {"h17.org", "v3"}.]
 . Apply algorithm described in Section 7.7
 “Unique Package Names” in [JLS] to derive a unique package name from the
 potential internet domain name contained within the first component. The
 internet domain name is reversed, component by component. Note that a
-leading “ _www_ .” is not considered part of an internet domain name and
+leading `"www."` is not considered part of an internet domain name and
 must be dropped.
-
++
 If the first component does not contain
 either one of the top-level domain names, for example, com, gov, net,
 org, edu, or one of the English two-letter codes identifying countries
 as specified in ISO Standard 3166, 1981, this step must be skipped.
-
- _\{“com”, “acme”, “go”, “espeak”}_
-
-. For each string in the list, convert each
-string to be all lower case.
-
- _\{"com”, “acme”, "go", "espeak" }_
-
++
+[source]
+----
+{"com", "acme", "go", "espeak"}
+----
+. For each string in the list, convert each string to be all lower case.
++
+[source]
+----
+{"com", "acme", "go", "espeak"}
+----
 . For each string remaining, the following
 conventions are adopted from [JLS] Section 7.7, “Unique Package Names.”
-. If the sting component contains a hyphen,
+.. If the sting component contains a hyphen,
 or any other special character not allowed in an identifier, convert it
 into an underscore.
-. If any of the resulting package name
+.. If any of the resulting package name
 components are keywords then append underscore to them.
-. If any of the resulting package name
+.. If any of the resulting package name
 components start with a digit, or any other character that is not
 allowed as an initial character of an identifier, have an underscore
 prefixed to the component.
 
- _\{"com”, “acme”, "go", "espeak" }_
++
+[source]
+----
+{"com", "acme", "go", "espeak"}
+----
 
 . Concatenate the resultant list of strings
-using _’.’_ as a separating character to produce a package name.
-
- _Final package name: "com.acme.go.espeak"._
+using `"."` as a separating character to produce a package name.
++
+[source]
+----
+Final package name: "com.acme.go.espeak".
+----
 
 link:jaxb.html#a4767[See Collisions
 and conflicts], specifies what to do when the above algorithm results in
 an invalid Java package name.
 
-=== [[a4816]]Conforming Java Identifier Algorithm
+=== Conforming Java Identifier Algorithm
 
 This section describes how to convert a legal
 Java identifier which may not conform to Java naming conventions to a
 Java identifier that conforms to the standard naming conventions.
-link:jaxb.html#a1608[See Customized Name Mapping]“discusses when
+link:jaxb.html#a1608[See Customized Name Mapping] discusses when
 this algorithm is applied to customization names.
 
 Since a legal Java identifier is also a XML
 name, this algorithm is the same as link:jaxb.html#a4656[See The
-Name to Identifier Mapping Algorithm]” with the following exception:
+Name to Identifier Mapping Algorithm] with the following exception:
 constant names must not be mapped to a Java constant that conforms to
 the Java naming convention for a constant.