This is a slightly updated question that was originally posted here: XSL – Finding another nodes value using the value of the current context .
I have an XML that uses PackageID values to reference other nodes in the document.
I want to create a for-each loop for each CompositionPackage that has the Operation value of ‘Rasta’. Note: a CompositionPackage can have more than one Match.
I would like to use the result of the current node to then find the value of another node containing the returned PackageID value 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>
<MaterialPackage>
<PackageTracks>
<TimelineTrack>
<TrackSegment>
<ComponentLength>804</ComponentLength>
</TrackSegment>
</TimelineTrack>
</PackageTracks>
<PackageName>Name010</PackageName>
<PackageID>urn:44f70008</PackageID>
</MaterialPackage>
<CompositionPackage>
<PackageTracks>
<TimelineTrack>
<TrackSegment>
<Operation>Rasta</Operation>
<SourcePackageID>urn:44f70006</SourcePackageID>
<ComponentLength>10099</ComponentLength>
</TrackSegment>
</TimelineTrack>
<TimelineTrack>
<TrackSegment>
<Operation>NotRasta</Operation>
<SourcePackageID>urn:44f70007</SourcePackageID>
<ComponentLength>100</ComponentLength>
</TrackSegment>
<TimelineTrack>
<TrackSegment>
<Operation>Rasta</Operation>
<SourcePackageID>urn:44f70008</SourcePackageID>
<ComponentLength>200</ComponentLength>
</TrackSegment>
</TimelineTrack>
</TimelineTrack>
</PackageTracks>
<PackageName>NameABC</PackageName>
<PackageID>urn:ce1904fd</PackageID>
</CompositionPackage>
<CompositionPackage>
<PackageTracks>
<TimelineTrack>
<TrackSegment>
<Operation>Rasta</Operation>
<SourcePackageID>urn:00f70009</SourcePackageID>
<ComponentLength>222</ComponentLength>
</TrackSegment>
</TimelineTrack>
</PackageTracks>
<PackageName>NameABC</PackageName>
<PackageID>urn:ff1603fd</PackageID>
</CompositionPackage>
<CompositionPackage>
<PackageTracks>
<TimelineTrack>
<TrackSegment>
<Operation>Rasta</Operation>
<SourcePackageID>urn:11f80008</SourcePackageID>
<ComponentLength>444</ComponentLength>
</TrackSegment>
</TimelineTrack>
</PackageTracks>
<PackageName>NameBCD</PackageName>
<PackageID>urn:gg1702fj</PackageID>
</CompositionPackage>
<CompositionPackage>
<PackageTracks>
<TimelineTrack>
<TrackSegment>
<Operation>Rasta</Operation>
<SourcePackageID>urn:22f90009</SourcePackageID>
<ComponentLength>555</ComponentLength>
</TrackSegment>
</TimelineTrack>
</PackageTracks>
<PackageName>NameXYZ</PackageName>
<PackageID>urn:11f80010</PackageID>
</CompositionPackage>
<CompositionPackage>
<PackageTracks>
<TimelineTrack>
<TrackSegment>
<Operation>NotRasta</Operation>
<SourcePackageID>urn:22f90009</SourcePackageID>
<ComponentLength>555</ComponentLength>
</TrackSegment>
</TimelineTrack>
</PackageTracks>
<PackageName>NameWWW</PackageName>
<PackageID>urn:11f80008</PackageID>
</CompositionPackage>
<MaterialPackage>
<PackageTracks>
<TimelineTrack>
<TrackSegment>
<ComponentLength>864</ComponentLength>
</TrackSegment>
</TimelineTrack>
</PackageTracks>
<PackageName>Name008</PackageName>
<PackageID>urn:00f70009</PackageID>
</MaterialPackage>
<MaterialPackage>
<PackageTracks>
<TimelineTrack>
<TrackSegment>
<ComponentLength>864</ComponentLength>
</TrackSegment>
</TimelineTrack>
</PackageTracks>
<PackageName>Name002</PackageName>
<PackageID>urn:22f70009</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/CompositionPackage/PackageTracks/TimelineTrack/TrackSegment/Operation"> <!--whose Operation value is 'Rasta' -->
<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>200</Value1>
<Value2>urn:44f70008</Value2>
<Value3>Name010</Value3>
</newnode>
<newnode>
<Value1>222</Value1>
<Value2>urn:00f70009</Value2>
<Value3>Name008</Value3>
</newnode>
<newnode>
<Value1>444</Value1>
<Value2>urn:11f80008</Value2>
<Value3>NameWWW</Value3>
</newnode>
<newnode>
<Value1>555</Value1>
<Value2>urn:22f90009</Value2>
<Value3>Name002</Value3>
</newnode>
</Master>
My Current XSL is returning “” for all value3 elements.
The error is obvious: inside a
You have:
As an
Operationelement doesn’t have anyCompositionPackagechildren (and in fact doesn’t have any element children at all), the above selects nothing and nothing is output.Exactly the same case for the other two
xsl:value-ofinstructions inside the body ofxsl:for-eachThere are contradictions between the provided XML document and the wanted result and there are data errors:
There isn’t any
PackageIDelement with value “urn:22f90009”. Therefore, in the lastnewnodein the provided result,Value3must be empty — but in the provided result it has a non-empty string value.In the source XML document there are nested
TimelineTrackelements.These issues explain why the transformation I came up with doesn’t exactly produce the wanted result:
When this transformation is applied on the provided XML document:
the following result is produced: