[xsl] merging two xml files by a generic way - 2

Subject: [xsl] merging two xml files by a generic way - 2
From: Braumüller, Hans <H.Braumueller@xxxxxxxxxxxx>
Date: Wed, 28 Jun 2006 16:06:03 +0200
Hello again,

i include my bad solution, because i think it is very redundant and i must
adapt my source(s).xml with ids that have a corresponding in the doc2 for
getting the specific language titles.

Do you have a better approach ?

Here we go:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
  <xsl:param name="p_sLanguage" select="'en'"/>
  <!-- Default Path im Attribut select, wenn kein Parameter |bergeben wurde
-->
  <xsl:param name="p_sPathLng" select="'doc2_'"/>
  <xsl:param name="doc2file"
select="concat($p_sPathLng,$p_sLanguage,'.xml')"/>

  <!-- import der spezifischen Anzeige-Eigenschaften anhand des |bergebebenen
Parameters p_sLanguage  -->
  <!-- mit zweiter Option document('') wird f|r die document() Funktion die
Base-Uri relative zum Stylesheets deklariert   <xsl:variable
name="objApplicationProperties" select="document()"/>-->
  <xsl:output method="xml" version="1.0" encoding="iso-8859-1" indent="yes"/>
  <xsl:variable name="doc2" select="document($doc2file,document(''))"/>

  <!-- Start f|r alle -->
  <xsl:template match="/">
    <xsl:apply-templates>
      <xsl:with-param name="doc2node" select="$doc2/Root"/>
    </xsl:apply-templates>
  </xsl:template>


 <!--Start f|r nach variablem Root-Element -->
  <xsl:template match="/*">
    <xsl:param name="doc2node"/>
    <xsl:copy>
      <!-- Attribute -->
      <xsl:apply-templates select="@*" />

      <!-- erstmal direkt abfragen   -->
      <xsl:choose>
        <xsl:when test=" name() = 'Templates' ">
          <xsl:apply-templates>
            <xsl:with-param name="doc2node" select="$doc2node/Templates"/>
          </xsl:apply-templates>
        </xsl:when>
        <xsl:when test=" name() = 'Infos' ">
          <xsl:apply-templates>
            <xsl:with-param name="doc2node" select="$doc2node/Infos"/>
          </xsl:apply-templates>
        </xsl:when>
      </xsl:choose>

    </xsl:copy>
  </xsl:template>

  <!-- Identity copy of source-->
  <xsl:template match="*">
    <xsl:param name="doc2node"/>
    <!-- <xsl:varaible name="count" select="count()"/> -->
    <xsl:copy>
      <xsl:apply-templates select="@*[not(name()='id')]" />

       <xsl:if test=" normalize-space(@id) !='' ">
        <!-- searching for title in doc2 -->
        <xsl:call-template name="titleDoc2">
        <xsl:with-param name="id" select="@id"/>
        <xsl:with-param name="doc2node" select="$doc2node"/>
      </xsl:call-template>
      </xsl:if>

      <!-- go traversing  -->
      <xsl:apply-templates>
        <xsl:with-param name="doc2node" select="$doc2node"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>


<!-- Identity copy of doc2 only for @title with corresponding id from
source-->
  <xsl:template match="*" mode="lng">
    <xsl:param name="id"/>

    <xsl:choose>
      <!-- find by @param id -->
      <xsl:when test="normalize-space($id) = normalize-space(@id)">
       <xsl:apply-templates select="@title" />
	 <!--
	open question - how can i break the recursive traverse of source node, after
getting here the title from doc2
	-->
      </xsl:when>
      <!-- search -->
      <xsl:otherwise>
        <xsl:apply-templates mode="lng">
          <xsl:with-param name="id" select="$id"/>
        </xsl:apply-templates>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <!-- Title-Rule to find title  -->
  <xsl:template name="titleDoc2">
    <xsl:param name="id"/>
    <xsl:param name="doc2node"/>
       <xsl:apply-templates select="$doc2node" mode="lng">
        <xsl:with-param name="id" select="$id"/>
      </xsl:apply-templates>
  </xsl:template>

  <!-- Identity Kopie der Attribute vom Source oder Doc2 f|r Titel -->
  <xsl:template match="@*">
    <xsl:copy-of select="."/>
  </xsl:template>


</xsl:stylesheet>


Doc1 Example -----------
<?xml version="1.0" encoding="iso-8859-1"?>
<Templates>
  <Template name="CSV" id="CSV1">
    <Element name="head" id="CSV2">
      <Leaf name="Maprule" action="refresh,ins,del,save"  id="CSV3"
title="DE_defaultMaprule">
        <Attribute name="match" editable="manual" title="DE_CSV4" id="CSV4"/>
        <Attribute name="value" editable="drop" refersto="KOPF"  id="CSV5"/>
      </Leaf>
    </Element>
  </Template>
  <Template name="CSV_HO" id="CSV_HO1">
    <Element name="head" id="CSV_HO2">
      <Leaf name="Maprule" id="CSV_HO3">
        <Attribute name="match"  id="CSV_HO4"/>
        <Attribute name="value" editable="drop" refersto="KOPF"
id="CSV_HO5"/>
      </Leaf>
    </Element>
  </Template>
</Templates>

Doc2 Example ----------- Beginning with Root -Element inside Templates the
same structure as doc1
only with the language specific values for attribute title
<?xml version="1.0" encoding="iso-8859-1"?>
<Root>
  <Templates file="templates.xml">
    <Template  id="CSV1">
      <Element name="head" title="1HeadElement" id="CSV2">
        <Leaf name="Maprule" id="CSV3">
          <Attribute name="match" title="1match" id="CSV4"/>
          <Attribute name="value"  title="1value" id="CSV5"/>
        </Leaf>
      </Element>
      <!-- following element nodes() -->
    </Template>
    <Template name="CSV_HO" id="CSV_HO1">
      <Element name="head" title="2HeadElement"  id="CSV_HO2">
        <Leaf name="Maprule"  id="CSV_HO3">
          <Attribute name="match" title="2match"  id="CSV_HO4"/>
          <Attribute name="value" title="2value"  id="CSV_HO5"/>
        </Leaf>
      </Element>
      <!-- following element nodes() -->
    </Template>
  </Templates>
  <!-- another sections to put titles from other sources, following  infos.xml
-->
  <Infos file="infos.xml">
    <Template name="KOPF">
      <Element name="KOPF_INDEX" title="KOPF_INDEX"/>
      <!-- etc-->
    </Template>
    <Template name="POS">
      <Element name="POSITION_IDX" title="POSITION_IDX"/>
      <!-- etc-->
    </Template>
  </Infos>
  <!-- etc-->
</Root>

Output Example --------------------------------------------
<Templates>
<Template name="CSV">
<Element name="head" title="1HeadElement">
<Leaf name="Maprule" action="refresh,ins,del,save" title="DE_defaultMaprule">
<Attribute name="match" editable="manual" title="1match"></Attribute>
<Attribute name="value" editable="drop" refersto="KOPF"
title="1value"></Attribute>
</Leaf>
</Element>
</Template>
<Template name="CSV_HO">
<Element name="head" title="2HeadElement">
<Leaf name="Maprule">
<Attribute name="match" title="2match"></Attribute>
<Attribute name="value" editable="drop" refersto="KOPF"
title="2value"></Attribute>
</Leaf>
</Element>
</Template>
</Templates>

Thank you for help,
please excuse my signature below.
The company where i work put it automatically on my mails.

Greetings from Hamburg,

Hans Braum|ller
http://www.hanseorga.de





-------------------------------------------------------------------------

Profitieren Sie von unseren kostenlosen Informationsveranstaltungen
zum Thema:

  ----- ----- ----- ----- ----- ----- ---- -----

"Liquiditaetsmanagement und Treasury in SAP."

am 29. Juni 2006: Duesseldorf, Radisson SAS Hotel.

----- ----- ----- ----- ----- ----- ---- -----

F|r weitere Informationen und zu den Anmeldeformularen:

http://www.hanseorga.de/deutsch/framesets/veranstaltungen/frameroadshow.html
Wir freuen uns |ber Ihre Teilnahme!

-------------------------------------------------------------------------

Diese E-Mail enthaelt vertrauliche und/oder rechtlich geschuetzte
Informationen. Wenn Sie nicht der richtige Adressat sind oder diese E-Mail
irrtuemlich erhalten haben, informieren Sie bitte sofort den Absender und
vernichten Sie diese E-Mail. Das unerlaubte Kopieren sowie die unbefugte
Weitergabe dieser E-Mail ist nicht gestattet.

Current Thread