1

PackageID 値を使用してドキュメント内の他のノードを参照する XML があります。現在のノードの結果を使用して、ドキュメント内の一致する PackageID を含む別のノードの値を見つけたいと思います。この場合、SourcePackage/PackageName または MaterialPackage/PackageName の値、あるいは別の CompositionPackage の値を取得したいと考えています。この値は、CompositionPackage/PackageTracks/TimelineTrack/TrackSegment/SourcePackageID にある値と一致する 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>
      <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 要素に対して "" を返しています。

4

1 に答える 1

1

指定された変換にはいくつかのエラーがあります。

以下の変換は、エラーが修正されたものです。

 <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>
于 2012-08-17T03:22:43.437 に答える