1

XSLT を使用してファイルメーカーから xml 形式のデータをエクスポートしようとしています。xml の 3 か所に同じデータを表示したいと考えています。for-each タグを使用して、データを 1 回表示していました。ここで変数を使用する方法はいくつかありますが、方法がわかりません。

<xsl:for-each select="fmp:FMPXMLRESULT/fmp:RESULTSET/fmp:ROW">
  <xsl:for-each select="fmp:COL[3]/fmpATA">
    <marker>
      <name>
        <xsl:value-of select="."/>
      </name>
      <xsl:variable name="pos" select="position()" />
      <comment>
        <xsl:value-of select="../../fmp:COL[6]/fmpATA[$pos]"/>
      </comment>
      <in>
        <xsl:value-of select="../../fmp:COL[4]/fmpATA[$pos]"/>
      </in>
      <out>
      <xsl:value-of select="../../fmp:COL[5]/fmpATA[$pos]"/>
      </out>
    </marker>
  </xsl:for-each>
</xsl:for-each>

しかし、上記のデータを同じ XML の 3 つの異なる場所にエクスポートしたい場合、失敗します。上記の xslt にあるデータはすべて、同じ xslt 内の他の場所で使用できるようにコピーする必要があります。私は XSLT の専門家ではないので、わかりにくい場合は最初にお詫び申し上げます。どうもありがとう

出力:

<?xml version="1.0" encoding="UTF-8"?>
<xmeml version="1">
<sequence id="test_clip">
<name>test_clip</name>
<duration>7704</duration>
<rate>
<ntsc>FALSE</ntsc>
<timebase>25</timebase>
</rate>
<timecode>
<rate>
<ntsc>FALSE</ntsc>
<timebase>25</timebase>
</rate>
<string/>
<frame>90000</frame>
<source>source</source>
<displayformat>NDF</displayformat>
</timecode>
<in>-1</in>
<out>-1</out>
<media>
<video>
<format>
<samplecharacteristics>
<width>1024</width>
<height>576</height>
<anamorphic>FALSE</anamorphic>
<pixelaspectratio>Square</pixelaspectratio>
<fielddominance>none</fielddominance>
<rate>
<ntsc>FALSE</ntsc>
<timebase>25</timebase>
</rate>
<colordepth>24</colordepth>
<codec>
<name>H.264</name>
<appspecificdata>
<appname>Final Cut Pro</appname>
<appmanufacturer>Apple Inc.</appmanufacturer>
<appversion>7.0</appversion>
<data>
<qtcodec>
<codecname>H.264</codecname>
<codectypename>H.264</codectypename>
<codectypecode>avc1</codectypecode>
<codecvendorcode>appl</codecvendorcode>
<spatialquality>1023</spatialquality>
<temporalquality>0</temporalquality>
<keyframerate>0</keyframerate>
<datarate>0</datarate>
</qtcodec>
</data>
</appspecificdata>
</codec>
</samplecharacteristics>
<appspecificdata>
<appname>Final Cut Pro</appname>
<appmanufacturer>Apple Inc.</appmanufacturer>
<appversion>7.0</appversion>
<data>
<fcpimageprocessing>
<useyuv>TRUE</useyuv>
<usesuperwhite>FALSE</usesuperwhite>
<rendermode>YUV8BPP</rendermode>
</fcpimageprocessing>
</data>
</appspecificdata>
</format>
<track>
<clipitem id="testclip3 ">
<name>testclip3</name>
<duration>7501</duration>
<rate>
<ntsc>FALSE</ntsc>
<timebase>25</timebase>
</rate>
<in>0</in>
<out>7501</out>
<start>203</start>
<end>7704</end>
<pixelaspectratio>Square</pixelaspectratio>
<enabled>TRUE</enabled>
<anamorphic>FALSE</anamorphic>
<alphatype>none</alphatype>
<masterclipid>testclip3 1</masterclipid>
<logginginfo>
<good>FALSE</good>
</logginginfo>
<file id="testclip3 2">
<name>testclip3.mov</name>
<pathurl>file://localhost/Users/itsupport/Desktop/testclip3.mov</pathurl>
<rate>
<timebase>25</timebase>
</rate>
<duration>7501</duration>
<media>
<video>
<duration>7501</duration>
<samplecharacteristics>
<width>1024</width>
<height>576</height>
</samplecharacteristics>
</video>
<audio>
<rate>
<timebase>48000</timebase>
</rate>
<trackcount>2</trackcount>
<samplecharacteristics>
<depth>16</depth>
</samplecharacteristics>
</audio>
</media>
</file>
<marker>
<name>Marker 1</name>
<comment>Man uses lit lighter to read postcard and sets fire to it accidentally</comment>
<in>911814</in>
<out>-1</out>
</marker>
<marker>
<name>Marker 2</name>
<comment>Painting</comment>
<in>913654</in>
<out>-1</out>
</marker>
<marker>
<name>Marker 3</name>
<comment/>
<in>914031</in>
<out>914032</out>
</marker>
<marker>
<name>Marker 4</name>
<comment>Women</comment>
<in>925375</in>
<out>-1</out>
</marker>
<marker>
<name>Marker 5</name>
<comment>Old woman</comment>
<in>932350</in>
<out>-1</out>
</marker>
<marker>
<name>Marker 6</name>
<comment>car accident</comment>
<in>933750</in>
<out>-1</out>
</marker>
<marker>
<name>Marker 7</name>
<comment/>
<in>900000</in>
<out>-1</out>
</marker>
<marker>
<name>Marker 8</name>
<comment/>
<in>943925</in>
<out>-1</out>
</marker>
<sourcetrack>
<mediatype>video</mediatype>
</sourcetrack>
<link>
<linkclipref>testclip3 </linkclipref>
<mediatype>video</mediatype>
<trackindex>1</trackindex>
<clipindex>1</clipindex>
</link>
<link>
<linkclipref>testclip3 3</linkclipref>
<mediatype>audio</mediatype>
<trackindex>1</trackindex>
<clipindex>1</clipindex>
<groupindex>1</groupindex>
</link>
<link>
<linkclipref>testclip3 4</linkclipref>
<mediatype>audio</mediatype>
<trackindex>2</trackindex>
<clipindex>1</clipindex>
<groupindex>1</groupindex>
</link>
<fielddominance>none</fielddominance>
</clipitem>
<enabled>TRUE</enabled>
<locked>FALSE</locked>
</track>
</video>
<audio/>
</media>
<ismasterclip>FALSE</ismasterclip>
<marker>
<name>Marker 1</name>
<comment>Man uses lit lighter to read postcard and sets fire to it accidentally</comment>
<in>911814</in>
<out>-1</out>
</marker>
<marker>
<name>Marker 2</name>
<comment>Painting</comment>
<in>913654</in>
<out>-1</out>
</marker>
<marker>
<name>Marker 3</name>
<comment/>
<in>914031</in>
<out>914032</out>
</marker>
<marker>
<name>Marker 4</name>
<comment>Women</comment>
<in>925375</in>
<out>-1</out>
</marker>
<marker>
<name>Marker 5</name>
<comment>Old woman</comment>
<in>932350</in>
<out>-1</out>
</marker>
<marker>
<name>Marker 6</name>
<comment>car accident</comment>
<in>933750</in>
<out>-1</out>
</marker>
<marker>
<name>Marker 7</name>
<comment/>
<in>900000</in>
<out>-1</out>
</marker>
<marker>
<name>Marker 8</name>
<comment/>
<in>943925</in>
<out>-1</out>
</marker>
<filter>
<effect>
<name>Distort</name>
<effectid>deformation</effectid>
<effectcategory>motion</effectcategory>
<effecttype>motion</effecttype>
<mediatype>video</mediatype>
<parameter>
<parameterid>aspect</parameterid>
<name>Aspect</name>
<valuemin>-10000</valuemin>
<valuemax>10000</valuemax>
<value>33.3333</value>
</parameter>
</effect>
</filter>
</sequence>
</xmeml>

上記の xml では、marker1、2、3...8 タグが 2 回表示されていることがわかります。これは、xmlを表示する方法です。XSLT では、「for-each」タグを 2 回コピーしたことに注意してください。これは動作しません。XSLT:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" 
xmlns:fmp="http://www.filemaker.com/fmpxmlresult"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="fmp">

<xsl:output method="xml" indent="yes" />

<xsl:template match="/">

<xmeml version="1">
<sequence id="test_clip">
    <name>test_clip</name>
    <duration>7704</duration>
    <rate>
        <ntsc>FALSE</ntsc>
        <timebase>25</timebase>
    </rate>
    <timecode>
        <rate>
            <ntsc>FALSE</ntsc>
            <timebase>25</timebase>
        </rate>
        <string><xsl:value-of select="fmp:COL[1]/fmp:DATA"/></string>
        <frame>90000</frame>
        <source>source</source>
        <displayformat>NDF</displayformat>
    </timecode>
    <in>-1</in>
    <out>-1</out>
    <media>
        <video><format>
                <samplecharacteristics>
                    <width>1024</width>
                    <height>576</height>
                    <anamorphic>FALSE</anamorphic>
                    <pixelaspectratio>Square</pixelaspectratio>
                    <fielddominance>none</fielddominance>
                    <rate>
                        <ntsc>FALSE</ntsc>
                        <timebase>25</timebase>
                    </rate>
                    <colordepth>24</colordepth>
                    <codec>
                        <name>H.264</name>
                        <appspecificdata>
                            <appname>Final Cut Pro</appname>
                            <appmanufacturer>Apple Inc.</appmanufacturer>
                            <appversion>7.0</appversion>
                            <data>
                                <qtcodec>
                                    <codecname>H.264</codecname>
                                    <codectypename>H.264</codectypename>
                                    <codectypecode>avc1</codectypecode>
                                    <codecvendorcode>appl</codecvendorcode>
                                    <spatialquality>1023</spatialquality>
                                    <temporalquality>0</temporalquality>
                                    <keyframerate>0</keyframerate>
                                    <datarate>0</datarate>
                                </qtcodec>
                            </data>
                        </appspecificdata>
                    </codec>
                </samplecharacteristics>
                <appspecificdata>
                    <appname>Final Cut Pro</appname>
                    <appmanufacturer>Apple Inc.</appmanufacturer>
                    <appversion>7.0</appversion>
                    <data>
                        <fcpimageprocessing>
                            <useyuv>TRUE</useyuv>
                            <usesuperwhite>FALSE</usesuperwhite>
                            <rendermode>YUV8BPP</rendermode>
                        </fcpimageprocessing>
                    </data>
                </appspecificdata>
            </format>
            <track>
                <clipitem id="testclip3 ">
                    <name>testclip3</name>
                    <duration>7501</duration>
                    <rate>
                        <ntsc>FALSE</ntsc>
                        <timebase>25</timebase>
                    </rate>
                    <in>0</in>
                    <out>7501</out>
                    <start>203</start>
                    <end>7704</end>
                    <pixelaspectratio>Square</pixelaspectratio>
                    <enabled>TRUE</enabled>
                    <anamorphic>FALSE</anamorphic>
                    <alphatype>none</alphatype>
                    <masterclipid>testclip3 1</masterclipid>
                    <logginginfo>
                        <good>FALSE</good>
                    </logginginfo>
                    <file id="testclip3 2">
                        <name>testclip3.mov</name>
                        <pathurl>file://localhost/Users/itsupport/Desktop/testclip3.mov</pathurl>
                        <rate>
                            <timebase>25</timebase>
                        </rate>
                        <duration>7501</duration>
                        <media>
                            <video>
                                <duration>7501</duration>
                                <samplecharacteristics>
                                    <width>1024</width>
                                    <height>576</height>
                                </samplecharacteristics>
                            </video>
                            <audio>
                                <rate>
                                    <timebase>48000</timebase>
                                </rate>
                                <trackcount>2</trackcount>
                                <samplecharacteristics>
                                    <depth>16</depth>
                                </samplecharacteristics>
                            </audio>
                        </media>
                    </file>

        <xsl:for-each select="fmp:FMPXMLRESULT/fmp:RESULTSET/fmp:ROW">

    <xsl:for-each select="fmp:COL[3]/fmp:DATA">
        <marker>
        <name>
            <xsl:value-of select="."/>
        </name>
            <xsl:variable name="pos" select="position()" />

            <comment>
            <xsl:value-of select="../../fmp:COL[6]/fmp:DATA[$pos]"/>
            </comment>

            <in>
            <xsl:value-of select="../../fmp:COL[4]/fmp:DATA[$pos]"/>
            </in>

            <out>
            <xsl:value-of select="../../fmp:COL[5]/fmp:DATA[$pos]"/>
            </out>

        </marker>
    </xsl:for-each>

</xsl:for-each>




                    <sourcetrack>
                        <mediatype>video</mediatype>
                    </sourcetrack>
                    <link>
                        <linkclipref>testclip3 </linkclipref>
                        <mediatype>video</mediatype>
                        <trackindex>1</trackindex>
                        <clipindex>1</clipindex>
                    </link>
                    <link>
                        <linkclipref>testclip3 3</linkclipref>
                        <mediatype>audio</mediatype>
                        <trackindex>1</trackindex>
                        <clipindex>1</clipindex>
                        <groupindex>1</groupindex>
                    </link>
                    <link>
                        <linkclipref>testclip3 4</linkclipref>
                        <mediatype>audio</mediatype>
                        <trackindex>2</trackindex>
                        <clipindex>1</clipindex>
                        <groupindex>1</groupindex>
                    </link>
                    <fielddominance>none</fielddominance>
                </clipitem>
                <enabled>TRUE</enabled>
                <locked>FALSE</locked>
            </track>

            </video>
        <audio></audio>
        </media>
            <ismasterclip>FALSE</ismasterclip>

        <xsl:for-each select="fmp:FMPXMLRESULT/fmp:RESULTSET/fmp:ROW">

    <xsl:for-each select="fmp:COL[3]/fmp:DATA">
        <marker>
        <name>
            <xsl:value-of select="."/>
        </name>
            <xsl:variable name="pos" select="position()" />

            <comment>
            <xsl:value-of select="../../fmp:COL[6]/fmp:DATA[$pos]"/>
            </comment>

            <in>
            <xsl:value-of select="../../fmp:COL[4]/fmp:DATA[$pos]"/>
            </in>

            <out>
            <xsl:value-of select="../../fmp:COL[5]/fmp:DATA[$pos]"/>
            </out>

        </marker>
    </xsl:for-each>

</xsl:for-each>

<filter>
        <effect>
        <name>Distort</name>
        <effectid>deformation</effectid>
        <effectcategory>motion</effectcategory>
        <effecttype>motion</effecttype>
        <mediatype>video</mediatype>
            <parameter>
                <parameterid>aspect</parameterid>
                <name>Aspect</name>
                <valuemin>-10000</valuemin>
                <valuemax>10000</valuemax>
                <value>33.3333</value>
            </parameter>
        </effect>
    </filter>
</sequence>
</xmeml>

</xsl:template>
</xsl:stylesheet>
4

3 に答える 3

2

入力と出力のサンプルを見せていただければ大変助かります。しかし、あなたの説明から、やりたいことは xsl:-each の結果を変数に取り込むことです:

<xsl:variable name="temp">
  <xsl:for-each select="...">

  </xsl:for-each>
</xsl:variable>

注意すべき唯一のことは、XSLT 1.0 では $temp の値が「結果ツリーのフラグメント」であり、その使用方法に深刻な制限があることです。多くの場合、ベンダー固有の xx:node-set() 拡張機能を使用して、通常のノードに変換する必要があります。

于 2013-03-22T14:41:27.110 に答える
0

ループの定義と実行を分割できます。

ループは次のようになります。

<xsl:template match="fmp:FMPXMLRESULT/fmp:RESULTSET/fmp:ROW">
  <xsl:for-each select="fmp:COL[3]/fmpATA">
    <marker>
      <name>
        <xsl:value-of select="."/>
      </name>
      <xsl:variable name="pos" select="position()" />
      <comment>
        <xsl:value-of select="../../fmp:COL[6]/fmpATA[$pos]"/>
      </comment>
      <in>
        <xsl:value-of select="../../fmp:COL[4]/fmpATA[$pos]"/>
      </in>
      <out>
        <xsl:value-of select="../../fmp:COL[5]/fmpATA[$pos]"/>
      </out>
    </marker>
  </xsl:for-each>
</xsl:template>

そして、そのループを呼び出したいときはいつでも、

<xsl:apply-templates select="/fmp:FMPXMLRESULT/fmp:RESULTSET/fmp:ROW" />
于 2013-03-22T12:18:41.357 に答える
0

Michael Kay が述べたように、次のように a の結果をfor-each変数にキャプチャしxsl:copy-ofて、必要な場所に出力するために使用できます。

<xsl:stylesheet version="1.0"
    xmlns:fmp="http://www.filemaker.com/fmpxmlresult"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="fmp">

  <xsl:output method="xml" indent="yes" />

  <xsl:template match="/">

    <xsl:variable name="rowData">
      <xsl:for-each select="fmp:FMPXMLRESULT/fmp:RESULTSET/fmp:ROW">
        <xsl:for-each select="fmp:COL[3]/fmp:DATA">
          <marker>
            <name>
              <xsl:value-of select="."/>
            </name>
            <xsl:variable name="pos" select="position()" />

            <comment>
              <xsl:value-of select="../../fmp:COL[6]/fmp:DATA[$pos]"/>
            </comment>

            <in>
              <xsl:value-of select="../../fmp:COL[4]/fmp:DATA[$pos]"/>
            </in>

            <out>
              <xsl:value-of select="../../fmp:COL[5]/fmp:DATA[$pos]"/>
            </out>

          </marker>
        </xsl:for-each>
      </xsl:for-each>
    </xsl:variable>

    <xmeml version="1">
      <sequence id="test_clip">
        <name>test_clip</name>
        <duration>7704</duration>
        <rate>
          <ntsc>FALSE</ntsc>
          <timebase>25</timebase>
        </rate>
        <timecode>
          <rate>
            <ntsc>FALSE</ntsc>
            <timebase>25</timebase>
          </rate>
          <string>
            <xsl:value-of select="fmp:COL[1]/fmp:DATA"/>
          </string>
          <frame>90000</frame>
          <source>source</source>
          <displayformat>NDF</displayformat>
        </timecode>
        <in>-1</in>
        <out>-1</out>
        <media>
          ...

          <!-- Output the variable -->
          <xsl:copy-of select="rowData"/>
          <audio></audio>
        </media>
        <ismasterclip>FALSE</ismasterclip>

        <!-- Output the variable -->
        <xsl:copy-of select="$rowData"/>
        <filter>
          <effect>
            ...
          </effect>
        </filter>
      </sequence>
    </xmeml>
  </xsl:template>
</xsl:stylesheet>

より読みやすいアプローチは、for-each アウトを名前付きテンプレートに分割し、必要な場所でそれを呼び出すことです。

<xsl:stylesheet version="1.0"
    xmlns:fmp="http://www.filemaker.com/fmpxmlresult"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="fmp">

  <xsl:output method="xml" indent="yes" />

  <xsl:template match="/">

    <xmeml version="1">
      <sequence id="test_clip">
        <name>test_clip</name>
        <duration>7704</duration>
        <rate>
          <ntsc>FALSE</ntsc>
          <timebase>25</timebase>
        </rate>
        <timecode>
          <rate>
            <ntsc>FALSE</ntsc>
            <timebase>25</timebase>
          </rate>
          <string>
            <xsl:value-of select="fmp:COL[1]/fmp:DATA"/>
          </string>
          <frame>90000</frame>
          <source>source</source>
          <displayformat>NDF</displayformat>
        </timecode>
        <in>-1</in>
        <out>-1</out>
        <media>
          ...

          <!-- Call the template -->
          <xsl:call-template name="RowData" />
          <audio></audio>
        </media>
        <ismasterclip>FALSE</ismasterclip>

        <!-- Call the template -->
        <xsl:call-template name="RowData" />
        <filter>
          <effect>
            ...
          </effect>
        </filter>
      </sequence>
    </xmeml>
  </xsl:template>

  <xsl:template name="RowData">
    <xsl:for-each select="fmp:FMPXMLRESULT/fmp:RESULTSET/fmp:ROW">
      <xsl:for-each select="fmp:COL[3]/fmp:DATA">
        <marker>
          <name>
            <xsl:value-of select="."/>
          </name>
          <xsl:variable name="pos" select="position()" />

          <comment>
            <xsl:value-of select="../../fmp:COL[6]/fmp:DATA[$pos]"/>
          </comment>

          <in>
            <xsl:value-of select="../../fmp:COL[4]/fmp:DATA[$pos]"/>
          </in>

          <out>
            <xsl:value-of select="../../fmp:COL[5]/fmp:DATA[$pos]"/>
          </out>

        </marker>
      </xsl:for-each>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

for-eachしかし、最もクリーンで最も XSLT 風のアプローチは、パターン マッチング テンプレートを適切に使用し、 es を完全に取り除くことです。

<xsl:stylesheet version="1.0"
    xmlns:fmp="http://www.filemaker.com/fmpxmlresult"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="fmp">

  <xsl:output method="xml" indent="yes" />

  <xsl:template match="/">

    <!-- Store a variable with all the source rows, for easy access -->
    <xsl:variable name="rows" select="fmp:FMPXMLRESULT/fmp:RESULTSET/fmp:ROW" />

    <xmeml version="1">
      <sequence id="test_clip">
        <name>test_clip</name>
        <duration>7704</duration>
        <rate>
          <ntsc>FALSE</ntsc>
          <timebase>25</timebase>
        </rate>
        <timecode>
          <rate>
            <ntsc>FALSE</ntsc>
            <timebase>25</timebase>
          </rate>
          <string>
            <xsl:value-of select="fmp:COL[1]/fmp:DATA"/>
          </string>
          <frame>90000</frame>
          <source>source</source>
          <displayformat>NDF</displayformat>
        </timecode>
        <in>-1</in>
        <out>-1</out>
        <media>
          ...

          <!-- Apply templates to the rows -->
          <xsl:apply-templates select="$rows" />
          <audio></audio>
        </media>
        <ismasterclip>FALSE</ismasterclip>

        <!-- Apply templates to the rows -->
        <xsl:apply-templates select="$rows" />
        <filter>
          <effect>
            ...
          </effect>
        </filter>
      </sequence>
    </xmeml>
  </xsl:template>

  <xsl:template match="fmp:ROW">
    <xsl:apply-templates select="fmp:COL[3]/fmp:DATA" />
  </xsl:template>

  <xsl:template match="fmp:DATA">
    <marker>
      <name>
        <xsl:value-of select="."/>
      </name>
      <xsl:variable name="pos" select="position()" />

      <comment>
        <xsl:value-of select="../../fmp:COL[6]/fmp:DATA[$pos]"/>
      </comment>

      <in>
        <xsl:value-of select="../../fmp:COL[4]/fmp:DATA[$pos]"/>
      </in>

      <out>
        <xsl:value-of select="../../fmp:COL[5]/fmp:DATA[$pos]"/>
      </out>

    </marker>
  </xsl:template>
</xsl:stylesheet>
于 2013-03-22T17:57:42.810 に答える