[xsl] How to merge translated XML files with the same IDs

Subject: [xsl] How to merge translated XML files with the same IDs
From: Michael Müller-Hillebrand <mmh@xxxxxxxxxxxxx>
Date: Thu, 30 Apr 2009 16:48:57 +0200
Dear experts,

There is a XML document instance using unique IDs for internal cross-
references:

<doc language="en">
  <title id="id003">Wonderful World</title>
  <para>...</para>
  <para>... see <xref idref="id003" format="page" />.</para>
</doc>

Now assume this document is translated into many languages and in the
end all those documents should be merged into a single XML document
for publishing.

<book>
  <doc language="en">
  ...
  </doc>
  <doc language="de">
  ...
  </doc>
  <doc language="zh">
  ...
  </doc>
</book>

Since the translators do not touch the IDs we suddenly would have many
duplicate IDs in the document. I already learned the using doc() it is
possible to access XML files with the same IDs, but of course the
resulting document would not be valid against the DTD.

My approach would be to prefix every @id and @idref with the (unique)
@language of the <doc> element like this:

<xsl:template match="@idref | @id">
  <xsl:attribute name="{name()}">
    <xsl:value-of select="concat(ancestor::doc/@language, '_', .)"/>
  </xsl:attribute>
</xsl:template>

Or is there a more elegant way? I will be using XSLT 2.0.

Thanks,

- Michael M|ller-Hillebrand

--
_______________________________________________________________
Michael M|ller-Hillebrand: Dokumentation Technology
Adobe Certified Expert, FrameMaker
Consulting and Training, FrameScript, XML/XSL, Unicode
Blog [de]: http://cap-studio.de/

Current Thread