XSLT- Pre Define NameSpace

user1540142

Hi I have an XML that upon each delivery has a different unique named Namespace that I cannot pre determine with standard processes.

<ABC xmlns:this="urn:uuid:9b1f15a9-69de-11d2-b6bc-fcab70ff7331" version="1.1">
<Extensions>
  <Identification>urn:uuid:9b1f15a9-69de-11d2-b6bc-fcab70ff7331</Identification>
  <Extension>
    <SrcPackage>
        <this:ABDList>
          <TaggedValue>111</TaggedValue>
        </this:ABDList>
        <this:SubBegin>0</this:SubBegin>
    </SrcPackage>
    <MatPackage>
        <this:ABDList>
          <TaggedValue>222</TaggedValue>
        </this:ABDList>
        <this:SubBegin>1</this:SubBegin>
    </MatPackage>
    <!-- Stuff -->
  </Extention>
</Extentions>
</ABC>

The Next XML delivered could be

<ABC xmlns:this="urn:uuid:9b1FFae4-69de-11d2-b6bc-fcab70ff7331" version="1.1">
<Extensions>
  <Identification>urn:uuid:9b1FFae4-69de-11d2-b6bc-fcab70ff7331</Identification>
  <Extension>
    <SrcPackage>
        <this:ABDList>
          <TaggedValue>333</TaggedValue>
        </this:ABDList>
        <this:SubBegin>0</this:SubBegin>
    </SrcPackage>
    <MatPackage>
        <this:ABDList>
          <TaggedValue>444</TaggedValue>
        </this:ABDList>
        <this:SubBegin>1</this:SubBegin>
    </MatPackage>
    <!-- Stuff -->
  </Extention>
</Extentions>
</ABC>

My current XSL stylesheet works on the first XML predefining the Namespace But I am looking to find a way to re-define it later on. on the process. I have added a variable to pull the relevant uuid from the Identification element but am not sure how to integrate this. Using the below stylesheet to process any other XML results in false results.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:this="urn:uuid:9b1f15a9-69de-11d2-b6bc-fcab70ff7331"
xmlns:ext="http://exslt.org/common" exclude-result-prefixes="ext">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes" />
<xsl:strip-space elements="*"/>

<xsl:variable name="SelOpGroup" select="/ABC/Extensions/Identification"/>

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

<xsl:template match="/ABC/Extensions/SrcPackage>
  <xsl:copy>
            <this:ABDList>
                <xsl:copy-of select ="this:ABDList/*"/>
                <TaggedA>888</TaggedA>
            </this:ABDList>
            <this:SubBegin><xsl:value-of select="somethingelse"/> </this:SubBegin>
  </xsl:copy>
</xsl:template>

<xsl:template match="/ABC/Extensions/MatPackage>
  <xsl:copy>
            <this:ABDList>
                <xsl:copy-of select ="this:ABDList/*"/>
                <TaggedB>999</TaggedB>
            </this:ABDList >
            <this:SubBegin><xsl:value-of select="somethingelse"/> </this:SubBegin>
  </xsl:copy>
</xsl:template>
</xsl:stylesheet>

Expected Result

<ABC xmlns:this="urn:uuid:9b1FFae4-69de-11d2-b6bc-fcab70ff7331" version="1.1">
<Extensions>
  <Identification>urn:uuid:9b1FFae4-69de-11d2-b6bc-fcab70ff7331</Identification>
  <Extension>
    <SrcPackage>
        <this:ABDList>
          <TaggedValue>333</TaggedValue>
          <TaggedA>888</TaggedA>
        </this:ABDList>
        <this:SubBegin>a value</this:SubBegin>
    </SrcPackage>
    <MatPackage>
        <this:ABDList>
          <TaggedValue>444</TaggedValue>
          <TaggedB>999</TaggedA>
        </this:ABDList>
        <this:SubBegin>a value</this:SubBegin>
    </MatPackage>
    <!-- Stuff -->
  </Extention>
</Extentions>
</ABC>

Many thanks, Adrian

Dimitre Novatchev

This transformation:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" omit-xml-declaration="yes" indent="yes" />
  <xsl:strip-space elements="*"/>

  <xsl:variable name="SelOpGroup" select="/ABC/Extensions/Identification"/>

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

  <xsl:template match="Extension/SrcPackage">
    <xsl:copy>
            <xsl:element name="{'this:ABDList'}" namespace="{$SelOpGroup}">
                <xsl:copy-of select="/*/namespace::*[name()='this']"/>
                <xsl:copy-of select ="*[name() = 'this:ABDList']/*"/>
                <TaggedA>888</TaggedA>
            </xsl:element>
            <xsl:element name="{'this:SubBegin'}" namespace="{$SelOpGroup}">
                <xsl:copy-of select="/*/namespace::*[name()='this']"/>
                <xsl:value-of select="'somethingelse'"/>
            </xsl:element>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="Extension/MatPackage">
    <xsl:copy>
            <xsl:element name="{'this:ABDList'}" namespace="{$SelOpGroup}">
                <xsl:copy-of select="/*/namespace::*[name()='this']"/>
                <xsl:copy-of select ="*[name() = 'this:ABDList']/*"/>
                <TaggedB>999</TaggedB>
            </xsl:element>
            <xsl:element name="{'this:SubBegin'}" namespace="{$SelOpGroup}">
                <xsl:copy-of select="/*/namespace::*[name()='this']"/>
                <xsl:value-of select="'somethingelse'"/>
            </xsl:element>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

When applied on the first provided XML document:

<ABC xmlns:this="urn:uuid:9b1f15a9-69de-11d2-b6bc-fcab70ff7331" version="1.1">
    <Extensions>
        <Identification>urn:uuid:9b1f15a9-69de-11d2-b6bc-fcab70ff7331</Identification>
        <Extension>
            <SrcPackage>
                <this:ABDList>
                    <TaggedValue>111</TaggedValue>
                </this:ABDList>
                <this:SubBegin>0</this:SubBegin>
            </SrcPackage>
            <MatPackage>
                <this:ABDList>
                    <TaggedValue>222</TaggedValue>
                </this:ABDList>
                <this:SubBegin>1</this:SubBegin>
            </MatPackage>
            <!-- Stuff -->
        </Extension>
    </Extensions>
</ABC>

Produces the wanted, correct result:

<ABC xmlns:this="urn:uuid:9b1f15a9-69de-11d2-b6bc-fcab70ff7331" version="1.1">
   <Extensions>
      <Identification>urn:uuid:9b1f15a9-69de-11d2-b6bc-fcab70ff7331</Identification>
      <Extension>
         <SrcPackage>
            <this:ABDList>
               <TaggedValue>111</TaggedValue>
               <TaggedA>888</TaggedA>
            </this:ABDList>
            <this:SubBegin>somethingelse</this:SubBegin>
         </SrcPackage>
         <MatPackage>
            <this:ABDList>
               <TaggedValue>222</TaggedValue>
               <TaggedB>999</TaggedB>
            </this:ABDList>
            <this:SubBegin>somethingelse</this:SubBegin>
         </MatPackage><!-- Stuff -->
      </Extension>
   </Extensions>
</ABC>

When the same transformation is applied on the second provided XML document:

<ABC xmlns:this="urn:uuid:9b1FFae4-69de-11d2-b6bc-fcab70ff7331" version="1.1">
<Extensions>
  <Identification>urn:uuid:9b1FFae4-69de-11d2-b6bc-fcab70ff7331</Identification>
  <Extension>
    <SrcPackage>
        <this:ABDList>
          <TaggedValue>333</TaggedValue>
        </this:ABDList>
        <this:SubBegin>0</this:SubBegin>
    </SrcPackage>
    <MatPackage>
        <this:ABDList>
          <TaggedValue>444</TaggedValue>
        </this:ABDList>
        <this:SubBegin>1</this:SubBegin>
    </MatPackage>
    <!-- Stuff -->
  </Extension>
</Extensions>
</ABC>

Again the wanted, correct result is produced:

<ABC xmlns:this="urn:uuid:9b1FFae4-69de-11d2-b6bc-fcab70ff7331" version="1.1">
   <Extensions>
      <Identification>urn:uuid:9b1FFae4-69de-11d2-b6bc-fcab70ff7331</Identification>
      <Extension>
         <SrcPackage>
            <this:ABDList>
               <TaggedValue>333</TaggedValue>
               <TaggedA>888</TaggedA>
            </this:ABDList>
            <this:SubBegin>somethingelse</this:SubBegin>
         </SrcPackage>
         <MatPackage>
            <this:ABDList>
               <TaggedValue>444</TaggedValue>
               <TaggedB>999</TaggedB>
            </this:ABDList>
            <this:SubBegin>somethingelse</this:SubBegin>
         </MatPackage><!-- Stuff -->
      </Extension>
   </Extensions>
</ABC>

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related