1

movie.xml と Amazon Product Advertising API XML の 2 つの異なる XML ファイルがあります。

これは、両方の XML ファイルを変換する私の XSLT ファイルです。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:aws="http://webservices.amazon.com/AWSECommerceService/2011-08-01"
exclude-result-prefixes="aws">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

<xsl:template match="/">
    <xsl:element name="html">
        <xsl:element name="head">
            <xsl:element name="h2">Movies list</xsl:element>
        </xsl:element>
        <xsl:element name="body">
            <xsl:apply-templates select="/movies/movie"/>
            <xsl:apply-templates select="aws:ItemLookupResponse/aws:Items/aws:Item/aws:ItemAttributes/aws:Title"/>
        </xsl:element>
    </xsl:element>
</xsl:template>

<xsl:template match="movie">
    <xsl:element name="a">
        <xsl:attribute name="href">movie_details.php?movieID=<xsl:value-of select="@movieID"/></xsl:attribute>
        <xsl:value-of select="title"/>
    </xsl:element>
    <xsl:element name="br" />
</xsl:template>

<xsl:template match="aws:Title">
    <xsl:element name="h2">Amazon Movie 1</xsl:element>
    <xsl:value-of select="." />
</xsl:template>

</xsl:stylesheet>

apply-templates select="/movies/movie - movies.xml から 5 つの映画タイトルのリストを読み込み、ハイパーリンクとして表示します。

apply-templates select="aws:ItemLookupResponse/aws:Items/aws:Item/aws:ItemAttributes/aws:Title" - Amazon API xml ファイルから映画のタイトルを読み込み、プレーン テキストとして表示します。

これは私のHTML出力です:

<html>
  <head>
    <h2>Movies list</h2>
  </head>
  <body>
    <a href="movie_details.php?movieID=1">The Dark Knight Rises</a>
    <br/>
    <a href="movie_details.php?movieID=2">Lawless</a>
    <br/>
    <a href="movie_details.php?movieID=3">Inception</a>
    <br/>
    <a href="movie_details.php?movieID=4">Looper</a>
    <br/>
    <a href="movie_details.php?movieID=5">Django Unchained</a>
    <br/>
  </body>
</html>
<html>
  <head>
    <h2>Movies list</h2>
  </head>
  <body><h2>Amazon Movie 1</h2>Dark Knight Rises [Blu-ray] [2012] [US Import]</body>
</html>

ご覧のとおり、これら 2 つのテンプレートは別々の HTML タグで表示され、両方のテンプレートで Head 要素の「Movies list」が 2 回表示されます。

これらのテンプレートの両方を 1 つの HTML 要素に組み込むことができれば、何も重複することはありません。私はいくつかの方法でそれをやろうとしましたが、まだ成功していません。

これは、2 つの XML ファイルと 1 つの XSLT スタイルシートを作成する PHP ファイルです。また、Amazon 製品への署名付き URL も生成します。

include('aws_signed_request.php');

$public_key = 'XXXXXXXXXXXXXXXXXXXXXX';
$private_key = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
$associate_tag = 'xxxxxxxxxxxxxxxxxxxxxxx';

// generate signed URL
$request = aws_signed_request('co.uk', array(
        'Operation' => 'ItemLookup',
        'ItemId' => 'B004LWZWGK',
        'ResponseGroup' => 'Small'), $public_key, $private_key, $associate_tag);

// do request (you could also use curl etc.)
$response = @file_get_contents($request);
if ($response === FALSE) {
    echo "Request failed.\n";
} else {

    // parse XML
    $xml = new DOMDocument();
    $xml->load('movies.xml');

    $xml2 = new DOMDocument();
    $xml2->loadXML($response);

    $xsl = new DOMDocument;
    $xsl->load('movies_list.xsl');

    $proc = new XSLTProcessor();
    $proc->importStyleSheet($xsl);

    echo $proc->transformToXML($xml);
    echo $proc->transformToXML($xml2);

}

映画.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="index.xsl"?>
<movies
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="movies.xsd">

<movie movieID="1">
    <title>The Dark Knight Rises</title>
</movie>

<movie movieID="2">
    <title>Lawless</title>
</movie>

<movie movieID="3">
    <title>Inception</title>
</movie>

<movie movieID="4">
    <title>Looper</title>
</movie>

<movie movieID="5">
    <title>Django Unchained</title>
</movie>
</movies>

Amazon 商品広告 API XML

<ItemLookupResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2011-08-01">
   <OperationRequest>
       <HTTPHeaders>
          <Header Name="UserAgent" Value="Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22"/>
       </HTTPHeaders>
       <RequestId>a1138e89-4335-4650-80f2-641e3c58b623</RequestId>
       <Arguments>
    <Argument Name="Operation" Value="ItemLookup"/>
    <Argument Name="Service" Value="AWSECommerceService"/>
    <Argument Name="Signature" Value="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"/>
    <Argument Name="AssociateTag" Value="xxxxxxxxxxxxxx"/>
    <Argument Name="Version" Value="2011-08-01"/>
    <Argument Name="ItemId" Value="B004LWZWGK"/>
    <Argument Name="AWSAccessKeyId" Value="xxxxxxxxxxxxxxxxxxxx"/>
    <Argument Name="Timestamp" Value="2013-03-21T13:56:55.000Z"/>
    <Argument Name="ResponseGroup" Value="Small"/>
       </Arguments>
       <RequestProcessingTime>0.0189320000000000</RequestProcessingTime>
       </OperationRequest>
    <Items>
      <Item>
         <ItemAttributes>
           <Title>
            The Dark Knight Rises (Blu-ray/DVD Combo+UltraViolet Digital Copy)
           </Title>
         </ItemAttributes>
      </Item>
    </Items>
</ItemLookupResponse>

ブラウザ出力:

ブラウザ.

4

2 に答える 2

1

XSLTProcessor では XML コンテンツをパラメーターとして設定できないようです (setParameter 関数は文字列のみを受け入れます)。そのため、ここここでdocument説明されているように、XSLT 関数を使用して複数の入力ドキュメントを処理する必要があります。Amazon からの応答をファイル システムにファイルとして保存する必要がある場合、XSLT は次のようになります (ここではファイル名を簡略化しています)。

<xsl:variable name="amazon" select="document('amazon.xml')"/>

<xsl:template match="/">
    <html>
        <body>
            <h2>Movies List</h2>
            <xsl:apply-templates select="movies/movie" />
            <h2>
                <xsl:value-of select="normalize-space($amazon/aws:ItemLookupResponse/aws:Items/aws:Item/aws:ItemAttributes/aws:Title)"/>
            </h2>
        </body>
    </html>
</xsl:template>

<xsl:template match="movie">
    <a>
        <xsl:attribute name="href">movie_details.php?movieID=<xsl:value-of select="@movieID"/></xsl:attribute>
        <xsl:value-of select="title"/>
    </a>
    <br/>
</xsl:template>

編集:私の元の回答に対するコメントに従ってコードが変更され、「多対1」の問題に関する言語が削除されました。

于 2013-03-22T00:56:13.363 に答える
1

I cannot repro the problem.

With your XSLT code (slightly changed to access "movies.xml" by calling the document() function):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:aws="http://webservices.amazon.com/AWSECommerceService/2011-08-01"
exclude-result-prefixes="aws">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

<xsl:variable name="vMoviesDoc" select=
 "document('file:///c:/temp/delete/movies.xml')"/>

<xsl:template match="/">
    <xsl:element name="html">
        <xsl:element name="head">
            <xsl:element name="h2">Movies list</xsl:element>
        </xsl:element>
        <xsl:element name="body">
            <xsl:apply-templates select="$vMoviesDoc/movies/movie"/>
            <xsl:apply-templates select="aws:ItemLookupResponse/aws:Items/aws:Item/aws:ItemAttributes/aws:Title"/>
        </xsl:element>
    </xsl:element>
</xsl:template>

<xsl:template match="movie">
    <xsl:element name="a">
        <xsl:attribute name="href">movie_details.php?movieID=<xsl:value-of select="@movieID"/></xsl:attribute>
        <xsl:value-of select="title"/>
    </xsl:element>
    <xsl:element name="br" />
</xsl:template>

<xsl:template match="aws:Title">
    <xsl:element name="h2">Amazon Movie 1</xsl:element>
    <xsl:value-of select="." />
</xsl:template>

</xsl:stylesheet>

when applied on the provided Amazon product advertising API XML document:

<ItemLookupResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2011-08-01">
   <OperationRequest>
       <HTTPHeaders>
          <Header Name="UserAgent" Value="Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22"/>
       </HTTPHeaders>
       <RequestId>a1138e89-4335-4650-80f2-641e3c58b623</RequestId>
       <Arguments>
    <Argument Name="Operation" Value="ItemLookup"/>
    <Argument Name="Service" Value="AWSECommerceService"/>
    <Argument Name="Signature" Value="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"/>
    <Argument Name="AssociateTag" Value="xxxxxxxxxxxxxx"/>
    <Argument Name="Version" Value="2011-08-01"/>
    <Argument Name="ItemId" Value="B004LWZWGK"/>
    <Argument Name="AWSAccessKeyId" Value="xxxxxxxxxxxxxxxxxxxx"/>
    <Argument Name="Timestamp" Value="2013-03-21T13:56:55.000Z"/>
    <Argument Name="ResponseGroup" Value="Small"/>
       </Arguments>
       <RequestProcessingTime>0.0189320000000000</RequestProcessingTime>
       </OperationRequest>
    <Items>
      <Item>
         <ItemAttributes>
           <Title>
            The Dark Knight Rises (Blu-ray/DVD Combo+UltraViolet Digital Copy)
           </Title>
         </ItemAttributes>
      </Item>
    </Items>
</ItemLookupResponse>

and having the provided XML document (file "movies.xml") in the local directory "C:\temp\delete":

<movies xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:noNamespaceSchemaLocation="movies.xsd">
    <movie movieID="1">
        <title>The Dark Knight Rises</title>
    </movie>
    <movie movieID="2">
        <title>Lawless</title>
    </movie>
    <movie movieID="3">
        <title>Inception</title>
    </movie>
    <movie movieID="4">
        <title>Looper</title>
    </movie>
    <movie movieID="5">
        <title>Django Unchained</title>
    </movie>
</movies>

the transformation produces the following result, where there is no duplication of head:

<html>
   <head>
      <h2>Movies list</h2>
   </head>
   <body>
      <a href="movie_details.php?movieID=1">The Dark Knight Rises</a>
      <br/>
      <a href="movie_details.php?movieID=2">Lawless</a>
      <br/>
      <a href="movie_details.php?movieID=3">Inception</a>
      <br/>
      <a href="movie_details.php?movieID=4">Looper</a>
      <br/>
      <a href="movie_details.php?movieID=5">Django Unchained</a>
      <br/>
      <h2>Amazon Movie 1</h2>
            The Dark Knight Rises (Blu-ray/DVD Combo+UltraViolet Digital Copy)
           </body>
</html>
于 2013-03-22T03:13:17.487 に答える