Re: [xsl] Replacing values in the input file with values from a second file

Subject: Re: [xsl] Replacing values in the input file with values from a second file
From: Martin Honnen <Martin.Honnen@xxxxxx>
Date: Tue, 07 Apr 2009 15:29:45 +0200
Mark Peters wrote:
Hi Everyone,

I have a seemingly simple transformation project, but there is a piece
of the puzzle that I'm missing. Maybe the solution isn't so simple,
after all. :-)


Here is my input file.


<topic id="A">
   <title>Menus</title>
   <topic id="AB">
      <title>Menu AB Details</title>
      <body>
         <p id="AB1">
            <uicontrol conref="AB1a"/>
         </p>
         <p id="AB2">
            <uicontrol conref="AB2a"/>
	    <uicontrol conref="AB2b"/>
         </p>
       </body>
    </topic>
</topic>

For each uicontrol element, I'd like to substitute the element value
in a second file, whose id attribute value corresponds to the conref
value in the first file.

Here is the second file (navigation-labels.xml):

<topic id ="navigation-labels">
   <title>Navigation Labels</title>
   <body>
      <p><uicontrol id="AB1a">Oranges</uicontrol></p>
      <p><uicontrol id="AB2a">Apples</uicontrol></p>
      <p><uicontrol id="AB3b">Bananas</uicontrol></p>
   </body>
</topic>


Here is the output I'm trying to produce:


<topic id="A">
   <title>Menus</title>
   <topic id="AB">
      <title>Menu AB Details</title>
      <body>
         <p id="AB1">
            <uicontrol>Oranges</uicontrol>
         </p>
         <p id="AB2">
            <uicontrol>Apples</uicontrol>
	    <uicontrol>Bananas</uicontrol>
         </p>
       </body>
    </topic>
</topic>

Here is an example stylesheet:


<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
  version="1.0">

<xsl:output indent="yes"/>

<xsl:key name="uic" match="uicontrol" use="@id"/>

<xsl:variable name="uic-doc" select="document('navigation-labels.xml')"/>

  <xsl:template match="uicontrol">
    <xsl:variable name="ref" select="@conref"/>
    <xsl:copy>
      <xsl:for-each select="$uic-doc">
        <xsl:value-of select="key('uic', $ref)"/>
      </xsl:for-each>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

--

	Martin Honnen
	http://JavaScript.FAQTs.com/

Current Thread