-1

这是一个稍微更新的问题,最初发布在此处:XSL - Find another nodes value using the value of the current context。我有一个 XML,它使用 PackageID 值来引用文档中的其他节点。

我想为每个具有“拉斯塔”操作值的 CompositionPackage 创建一个 for-each 循环。注意:一个 CompositionPackage 可以有多个 Match。我想使用当前节点的结果然后在文档中查找包含返回的 PackageID 值的另一个节点的值。在这种情况下,我想获取 SourcePackage/PackageName 或 MaterialPackage/PackageName 或另一个具有与 CompositionPackage/PackageTracks/TimelineTrack/TrackSegment/SourcePackageID 中找到的 PackageID 值匹配的 PackageID 值的值。

示例 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>

我的 Current XSL 正在为所有 value3 元素返回 ""。

4

1 回答 1

3

错误很明显:在

<xsl:for-each select=
"AAG
  /Preface
    /ContentStorage
      /CompositionPackage
         /PackageTracks/TimelineTrack/TrackSegment/Operation">

你有

<xsl:value-of select =
 "CompositionPackage/PackageTracks/TimelineTrack/TrackSegment/ComponentLength"/>

由于一个Operation元素没有任何子CompositionPackage元素(实际上根本没有任何元素子元素),因此上面没有选择任何内容,也没有任何内容输出

xsl:value-of正文中的其他两条指令的情况完全相同xsl:for-each

提供的 XML 文档与想要的结果之间存在矛盾,并且存在数据错误

  1. 没有任何PackageID值为“urn:22f90009”的元素。因此,在最后newnode提供的结果中,Value3必须为空——但在提供的结果中,它有一个非空字符串值。

  2. 在源 XML 文档中有嵌套TimelineTrack元素。

这些问题解释了为什么我提出的转换不能完全产生想要的结果

<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
               /PackageTracks
                 /TimelineTrack
                   /TrackSegment[Operation='Rasta']
         ">
             <newnode>
               <value1>
                  <xsl:value-of select="ComponentLength"/>
               </value1>
               <value2>
                 <xsl:value-of select="SourcePackageID"/>
           </value2>
               <value3>
                 <xsl:value-of select=
                  "../../../../*[self::SourcePackage
                       or self::MaterialPackage
                       or self::CompositionPackage]
                                    [PackageID
                                    =
                                    current()/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>
            <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>

产生以下结果:

<Master>
    <newnode>
        <value1>10099</value1>
        <value2>urn:44f70006</value2>
        <value3>Name001</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></value3>
    </newnode>
</Master>
于 2012-08-18T02:30:06.273 回答