-1

これは、最初にここに投稿されたわずかに更新された質問です。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要素に対して「」を返します。

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の本文内の他の2つの命令についてもまったく同じケース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 に答える