<join>

<join> (jointure) identifie un segment de texte, qui peut être fragmenté, en pointant vers les éléments éventuellement dispersés qui le composent. 16.7 Aggregation
Module linking — 16 Linking, Segmentation, and Alignment
En complément des attributs globaux att.pointing (@target, @evaluate) att.typed (@type, @subtype)
targets spécifie les identifiants des éléments ou des passages qui doivent être réunis dans un élément virtuel.
Statut Optionel
Type de données 2–∞ occurrences of 

<rng:ref name="data.pointer"/>
data.pointer
séparé par un espace
Valeurs deux pointeurs ou plus (URI), séparés par des espaces.
result spécifie le nom de l'élément que cette agrégation est censée former.
Statut Optionel
Type de données

<rng:ref name="data.name"/>
data.name
Valeurs L'identificateur générique d'un élément dans le modèle XML utilisé.
scope indique si les cibles à réunir incluent l'intégralité de l'élément indiqué (le sous-arbre entier y compris sa racine) ou seulement les enfants de la cible (les branches du sous-arbre).
Statut Recommendé
Les valeurs autorisées sont:
root
les sous-arbres dotés de leur racine qui sont désignés par l'attribut targets sont joints ; chaque sous-arbre devient un fils de l'élément virtuel créé par la jointure. [Valeur par défaut]
branches
les fils des sous-arbres désignés par l'attribut targets deviennent les fils de l'élément virtuel (c'est-à-dire que les racines des sous-arbres disparaissent).
Utilisé par
Peut contenir
core: desc gloss
tagdocs: altIdent equiv
Declaration

<rng:element name="join">
 <rng:ref name="att.global.attributes"/>
 <rng:ref name="att.pointing.attributes"/>
 <rng:ref name="att.typed.attributes"/>
 <rng:optional>
  <rng:attribute name="targets">
   <rng:list>
    <rng:ref name="data.pointer"/>
    <rng:ref name="data.pointer"/>
    <rng:zeroOrMore>
     <rng:ref name="data.pointer"/>
    </rng:zeroOrMore>
   </rng:list>
  </rng:attribute>
 </rng:optional>
 <rng:optional>
  <rng:attribute name="result">
   <rng:ref name="data.name"/>
  </rng:attribute>
 </rng:optional>
 <rng:optional>
  <rng:attribute name="scope" a:defaultValue="root">
   <rng:choice>
    <rng:value>root</rng:value>
    <rng:value>branches</rng:value>
   </rng:choice>
  </rng:attribute>
 </rng:optional>
 <rng:zeroOrMore>
  <rng:ref name="model.glossLike"/>
 </rng:zeroOrMore>
</rng:element>
element join
{
   att.global.attributes,
   att.pointing.attributes,
   att.typed.attributes,
   attribute targets { list { data.pointer, data.pointer, data.pointer* } }?,
   attribute result { data.name }?,
   attribute scope { "root" | "branches" }?,
   model.glossLike*
}
Schematron

<sch:report test="@target and @targets">You may not supply both
@target and @targets</sch:report>
Schematron

<sch:report test="not(@target) and not(@targets)">You must
supply either @target or @targets</sch:report>
Schematron

<sch:assert test="contains(@target,' ')">You must supply at least two
values for @target</sch:assert>
Exemple

L'exemple ci-après est commenté dans la section 16.7 Aggregation:

<sp>
 <speaker>Hughie</speaker>
 <p>How does it go? <q>
   <l xml:id="fr_frog_x1">da-da-da</l>
   <l xml:id="fr_frog_l2">gets a new frog</l>
   <l>...</l>
  </q>
 </p>
</sp>
<sp>
 <speaker>Louie</speaker>
 <p>
  <q>
   <l xml:id="fr_frog_l1">When the old pond</l>
   <l>...</l>
  </q>
 </p>
</sp>
<sp>
 <speaker>Dewey</speaker>
 <p>
  <q>... <l xml:id="fr_frog_l3">It's a new pond.</l>
  </q>
 </p>
 <join
   targets="#fr_frog_l1 #fr_frog_l2 #fr_frog_l3"
   result="lg"
   scope="root"/>

</sp>

L'élément join présenté ci-dessus identifie un groupe de vers (lg) englobant les trois lignes de vers indiquées par les valeurs de l'attribut targets . La valeur root de l'attribut scope indique que l'élément virtuel résultat contient les trois éléments l joints tels qu'on les trouve à #fr_frog_l1 #fr_frog_l2 #fr_frog_l3, plutôt que leur contenu textuel.

Exemple

Dans cet exemple, l'attribut scope a la valeur branches pour indiquer que la liste virtuelle doit être constrruite en prenant les listes désignées par les valeurs de l'attribut targets de l'élément join , sans prendre en compte les balises list qui les contiennent, en réunissant en une liste virtuelle les items contenus dans ces listes.

<p>Southern dialect (my own variety, at least) has only <list xml:id="fr_LP1">
  <item>
   <s>I done gone</s>
  </item>
  <item>
   <s>I done went</s>
  </item>
 </list> whereas Negro Non-Standard basilect has both these and <list xml:id="fr_LP2">
  <item>
   <s>I done go</s>
  </item>
 </list>.</p>
<p>White Southern dialect also has <list xml:id="fr_LP3">
  <item>
   <s>I've done gone</s>
  </item>
  <item>
   <s>I've done went</s>
  </item>
 </list> which, when they occur in Negro dialect, should probably be considered as borrowings from other varieties of English.</p>
<join
  result="list"
  xml:id="fr_LST1"
  targets="#fr_LP1 #fr_LP2 #fr_LP3"
  scope="branches">

 <desc>Sample sentences in Southern speech</desc>
</join>