1
我有一個使用PackageID值引用文檔中其他節點的XML。 我想使用當前節點的結果,然後查找包含文檔中匹配PackageID的另一個節點的值。 在這種情況下,我想獲取SourcePackage/PackageName或MaterialPackage/PackageName或另一個具有與CompositionPackage/PackageTracks/TimelineTrack/TrackSegment/SourcePackageID中的PackageID值匹配的CompositionPackage的值。XSL - 使用當前上下文的值查找另一個節點值
示例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>
樣品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>
預期的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>
我目前的XSL是 「回」 的所有值3元。
嗨Dimitre,謝謝。和預期的XML一樣,我會認爲value3的值是Name001。第一個CompositionPackage的packageID與第一個SourcePackage的PackageID匹配。其包名是Name001。我會用更多的信息更新這個問題。 – user1540142 2012-08-17 03:44:48
@ user1540142,它實際上*是*'Name001' - 您可能已經看到此答案的早期版本 - 請刷新。 – 2012-08-17 03:52:11
謝謝你DIMITRE:你是XSL嚮導!我需要刷新:) – user1540142 2012-08-17 03:53:42