Processing xrefs and conrefs within a conref
- Direct URI reference (but not a same-topic fragment identifier )
- When the address is a direct URI reference of any form other than a same-topic fragment identifier, processors MUST resolve it relative to the source document that contains the original URI reference.
- Same-topic fragment identifier
- When the address is a same-topic fragment identifier, processors MUST resolve it relative to the location of the content reference (referencing context).
- Key reference
- When the address is a key reference, processors MUST resolve it relative to the location of the content reference (referencing context).
When resolving key references or same-topic fragment identifiers, the phrase location of the content reference means the final resolved context. For example, in a case where content references are chained (topic A pulls from topic B, which in turn pulls a reference from topic C), the reference is resolved relative to the topic that is rendered. When topic B is rendered, the reference is resolved relative to the content reference in topic B; when topic A is rendered, the reference is resolved relative to topic A. If content is pushed from topic A to topic B to topic C, then the same-topic fragment identifier is resolved in the context of topic C.
The implication is that a content reference or cross reference can resolve to different targets in different use contexts. This is because a URI reference that contains a same-topic fragment identifier is resolved in the context of the topic that contains the content reference, and a key reference is resolved in the context of the key scope that is in effect for each use of the topic that contains the content reference.
Example: Resolving conrefs to elements that contain cross references
Consider the following paragraphs in paras-01.dita that are intended
to be used by reference from other topics:
<topic id="paras-01"><title>Reusable paragraphs</title>
<body>
<p id="p1">See <xref href="#paras-01/p5"/>.</p>
<p id="p2">See <xref href="topic-02.dita#topic02/fig-01"/>.</p>
<p id="p3">See <xref href="#./p5"/>.</p>
<p id="p4">See <xref keyref="task-remove-cover"/>.</p>
<p id="p5">Paragraph 5 in paras-01.</p>
</body>
</topic>
The paragraphs are used by content reference from other topics, including the
using-topic-01.dita topic:
<topic id="using-topic-01"><title>Using topic one</title>
<body>
<p id="A" conref="paras-01.dita#paras-01/p1"/>
<p id="B" conref="paras-01.dita#paras-01/p2"/>
<p id="C" conref="paras-01.dita#paras-01/p3"/>
<p id="D" conref="paras-01.dita#paras-01/p4"/>
<p id="p5">Paragraph 5 in using-topic-01</p>
</body>
</topic>
Following resolution of the content references and processing of the
<xref> elements in the referenced paragraphs, the rendered cross
references in using-topic-01.dita are shown
in the following table.
| Paragraph | Value of @id attribute on conrefed paragraph | <xref> within conrefed paragraph | Resolution |
|---|---|---|---|
| A | p1 | <xref href="#paras-01/p5"/> |
The cross reference in paragraph p1 is a direct URI reference that does not
contain a same-topic fragment identifier. It can be resolved only to paragraph p5
in
paras-01.dita, which contains the content "Paragraph 5 in
paras-01". |
| B | p2 | <xref href="topic-02.dita#topic02/fig-01"/> |
The cross reference in paragraph p2 is a direct URI reference. It can be resolved
only to the element with id="fig-01" in
topic-02.dita. |
| C | p3 | <xref href="#./p5"/> |
The cross reference in paragraph p3 is a direct URI reference that contains a
same-topic fragment identifier. Because the URI reference contains a same-topic
fragment identifier, the reference is resolved in the context of the referencing topic
( If |
| D | p4 | <xref keyref="task-remove-cover"/> |
The cross reference in paragraph p4 is a key reference. It is resolved to whatever resource is bound to the key name "task-remove-cover" in the applicable map context. |
Example: Resolving conrefs to elements that contain key-based cross references
Consider the following map, which uses the topics from the previous example:
<map>
<topicgroup keyscope="product-1">
<topicref keys="task-remove-cover" href="prod-1-task-remove-cover.dita"/>
<topicref href="using-topic-01.dita"/>
</topicgroup>
<topicgroup keyscope="product-2">
<topicref keys="task-remove-cover" href="prod-2-task-remove-cover.dita"/>
<topicref href="using-topic-01.dita"/>
</topicgroup>
</map>
The map establishes two key scopes: "product-1" and "product-2". Within the map branches,
the key name "task-remove-cover" is bound to a different topic. The topic
using-topic-01.dita, which includes a conref to a paragraph that
includes a cross reference to the key name "task-remove-cover", is also referenced
in each
branch. When each branch is rendered, the target of the cross reference is different.
In the first branch with the key scope set to "product-1", the cross reference from
paragraph p4 is resolved to prod-1-task-remove-cover.dita. In the
second branch with the key scope set to "product-2", the cross reference from paragraph
p4
is resolved to prod-2-task-remove-cover.dita.