1

I have an XML that uses PackageID values to reference other nodes in the document. I would like to use the result of the current node to then find the value of another node containing the matching PackageID in the document. In this case I want to get the value of SourcePackage/PackageName or MaterialPackage/PackageName or another CompositionPackage that has a matching PackageID value to that found in CompositionPackage/PackageTracks/TimelineTrack/TrackSegment/SourcePackageID.

Sample XML:

<AAG version="1.1">
<Preface>
  <ContentStorage>
      <SourcePackage>
        <PackageTracks>
          <TimelineTrack>
            <TrackSegment>
                <ComponentLength>5066</ComponentLength>
            </TrackSegment>
          </TimelineTrack>
        </PackageTracks>
        <PackageName>Name001</PackageName>
        <PackageID>urn:44f70006</PackageID>
      </SourcePackage>
      <CompositionPackage>
        <PackageTracks>
          <TimelineTrack>
            <TrackSegment>
                <SourcePackageID>urn:44f70006</SourcePackageID>
                <ComponentLength>10099</ComponentLength>
            </TrackSegment>
          </TimelineTrack>
        </PackageTracks>
        <PackageName>NameABC</PackageName>
        <PackageID>urn:ce1904fd</PackageID>
      </CompositionPackage>
      <CompositionPackage>
        <PackageTracks>
          <TimelineTrack>
            <TrackSegment>
                <SourcePackageID>urn:00f70009</SourcePackageID>
                <ComponentLength>222</ComponentLength>
            </TrackSegment>
          </TimelineTrack>
        </PackageTracks>
        <PackageName>NameABC</PackageName>
        <PackageID>urn:ff1603fd</PackageID>
      </CompositionPackage>
      <CompositionPackage>
        <PackageTracks>
          <TimelineTrack>
            <TrackSegment>
                <SourcePackageID>urn:11f80008</SourcePackageID>
                <ComponentLength>444</ComponentLength>
            </TrackSegment>
          </TimelineTrack>
        </PackageTracks>
        <PackageName>NameBCD</PackageName>
        <PackageID>urn:gg1702fj</PackageID>
      </CompositionPackage>
      <CompositionPackage>
        <PackageTracks>
          <TimelineTrack>
            <TrackSegment>
                <SourcePackageID>urn:22f90009</SourcePackageID>
                <ComponentLength>555</ComponentLength>
            </TrackSegment>
          </TimelineTrack>
        </PackageTracks>
        <PackageName>NameXYZ</PackageName>
        <PackageID>urn:11f80008</PackageID>
      </CompositionPackage>
      <MaterialPackage>
        <PackageTracks>
          <TimelineTrack>
            <TrackSegment>
            <ComponentLength>864</ComponentLength>
            </TrackSegment>
          </TimelineTrack>
        </PackageTracks>
        <PackageName>Name002</PackageName>
        <PackageID>urn:00f70009</PackageID>
      </MaterialPackage>
  </ContentStorage>
</Preface>
</AAG>

Sample XSL:

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

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

 <xsl:template match = "AAG">
 <Master>
 <xsl:for-each select="AAG/Preface/ContentStorage">
 <newnode>
   <value1><xsl:value-of select ="CompositionPackage/PackageTracks/TimelineTrack/TrackSegment/ComponentLength"/></value1>
   <value2><xsl:value-of select ="CompositionPackage/PackageTracks/TimelineTrack/TrackSegment/SourcePackageID"/></value2>
   <value3><xsl:value-of select ="CompositionPackage/PackageTracks/TimelineTrack/TrackSegment[SourcePackageID=current()/MaterialPackage/PackageName"/></value3>
 </newnode>
 </xsl:for-each>
 </Master>
 </xsl:template>
 </xsl:stylesheet>

Expected XML:

<Master>
<newnode>
  <Value1>1099</Value1>
  <Value2>urn:44f70006</Value2>
  <Value3>Name001</Value3>
</newnode>
<newnode>
  <Value1>222</Value1>
  <Value2>urn:00f70009</Value2>
  <Value3>Name002</Value3>
</newnode>
<newnode>
  <Value1>444</Value1>
  <Value2>urn:11f80008</Value2>
  <Value3>NameXYZ</Value3>
</newnode>
<newnode>
  <Value1>555</Value1>
  <Value2>urn:22f90009</Value2>
  <Value3></Value3>
</newnode>
</Master>

My Current XSL is returning "" for all value3 elements.

1 Answer 1

1

The provided transformation has several errors.

The transformation below is the provided one with the errors corrected:

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

  <xsl:template match = "AAG">
   <Master>
     <xsl:for-each select="Preface/ContentStorage/CompositionPackage">
         <newnode>
           <value1>
              <xsl:value-of select=
                "PackageTracks/TimelineTrack/TrackSegment/ComponentLength"/>
           </value1>
           <value2>
             <xsl:value-of select=
              "PackageTracks/TimelineTrack/TrackSegment/SourcePackageID"/>
       </value2>
           <value3>
             <xsl:value-of select=
              "../*[self::SourcePackage or self::MaterialPackage]
                                [PackageID
                                =
                                current()
                                 /PackageTracks/TimelineTrack/TrackSegment/SourcePackageID
                                ]
                                /PackageName
                 "/>
           </value3>
         </newnode>
   </xsl:for-each>
  </Master>
  </xsl:template>
 </xsl:stylesheet>

When this transformation is applied on the provided XML document:

<AAG version="1.1">
    <Preface>
        <ContentStorage>
            <SourcePackage>
                <PackageTracks>
                    <TimelineTrack>
                        <TrackSegment>
                            <ComponentLength>5066</ComponentLength>
                        </TrackSegment>
                    </TimelineTrack>
                </PackageTracks>
                <PackageName>Name001</PackageName>
                <PackageID>urn:44f70006</PackageID>
            </SourcePackage>
            <CompositionPackage>
                <PackageTracks>
                    <TimelineTrack>
                        <TrackSegment>
                            <SourcePackageID>urn:44f70006</SourcePackageID>
                            <ComponentLength>10099</ComponentLength>
                        </TrackSegment>
                    </TimelineTrack>
                </PackageTracks>
                <PackageName>NameABC</PackageName>
                <PackageID>urn:ce1904fd</PackageID>
            </CompositionPackage>
            <CompositionPackage>
                <PackageTracks>
                    <TimelineTrack>
                        <TrackSegment>
                            <SourcePackageID>urn:00f70009</SourcePackageID>
                            <ComponentLength>222</ComponentLength>
                        </TrackSegment>
                    </TimelineTrack>
                </PackageTracks>
                <PackageName>NameABC</PackageName>
                <PackageID>urn:ff1603fd</PackageID>
            </CompositionPackage>
            <MaterialPackage>
                <PackageTracks>
                    <TimelineTrack>
                        <TrackSegment>
                            <ComponentLength>864</ComponentLength>
                        </TrackSegment>
                    </TimelineTrack>
                </PackageTracks>
                <PackageName>Name002</PackageName>
                <PackageID>urn:00f70009</PackageID>
            </MaterialPackage>
        </ContentStorage>
    </Preface>
</AAG>

the wanted, correct result is produced:

<Master>
   <newnode>
      <value1>10099</value1>
      <value2>urn:44f70006</value2>
      <value3>Name001</value3>
   </newnode>
   <newnode>
      <value1>222</value1>
      <value2>urn:00f70009</value2>
      <value3>Name002</value3>
   </newnode>
</Master>
Sign up to request clarification or add additional context in comments.

3 Comments

Hi Dimitre, Thank you. As in the expected XML I would think the value for value3 would be Name001. The packageID of the first CompositionPackage matches the PackageID of the First SourcePackage. whose PackageName is Name001. I will update the question with some more information.
@user1540142, It actually is Name001 -- you might have seen an earlier version of this answer -- please, refresh.
THANK YOU DIMITRE: YOU ARE THE XSL WIZARD! I needed to refresh :)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.