XSL - 使用当前上下文的值查找另一个节点值 [英] XSL - Finding another nodes value using the value of the current context
问题描述
我有一个 XML,它使用 PackageID 值来引用文档中的其他节点.我想使用当前节点的结果,然后在文档中找到包含匹配 PackageID 的另一个节点的值.在这种情况下,我想获取 SourcePackage/PackageName 或 MaterialPackage/PackageName 的值或另一个 CompositionPackage 的值,其 PackageID 值与 CompositionPackage/PackageTracks/TimelineTrack/TrackSegment/SourcePackageID 中的值相匹配.
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.
示例 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 正在为所有 value3 元素返回 "".
My Current XSL is returning "" for all value3 elements.
推荐答案
提供的转换有几个错误.
下面的转换是提供的已纠正错误的转换:
<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>
当此转换应用于提供的 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>
<MaterialPackage>
<PackageTracks>
<TimelineTrack>
<TrackSegment>
<ComponentLength>864</ComponentLength>
</TrackSegment>
</TimelineTrack>
</PackageTracks>
<PackageName>Name002</PackageName>
<PackageID>urn:00f70009</PackageID>
</MaterialPackage>
</ContentStorage>
</Preface>
</AAG>
产生想要的、正确的结果:
<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>
这篇关于XSL - 使用当前上下文的值查找另一个节点值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!