これは、最初にここに投稿されたわずかに更新された質問です。XSL-現在のコンテキストの値を使用して別のノードの値を検索します。PackageID値を使用してドキュメント内の他のノードを参照するXMLがあります。
Operation値が「Rasta」であるCompositionPackageごとにfor-eachループを作成したいと思います。注:CompositionPackageは複数の一致を持つことができます。現在のノードの結果を使用して、ドキュメント内で返されたPackageID値を含む別のノードの値を見つけたいと思います。この場合、SourcePackage/PackageNameまたはMaterialPackage/PackageNameの値、またはCompositionPackage / PackageTracks / TimelineTrack / TrackSegment/SourcePackageIDにあるものと一致するPackageID値を持つ別のCompositionPackageを取得したいと思います。
サンプル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>
サンプル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>
期待される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>
現在のXSLは、すべてのvalue3要素に対して「」を返します。