0

movies.xml映画のタイトルと、DVD と Bluray の Amazon API ItemId を格納する次のファイルがあります。

<movies
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="movies.xsd">

<movie movieID="1">
    <title>The Dark Knight</title>
    <amazon>
        <dvd>B004Q9SZGC</dvd>
        <bluray>B004Q9T6CO</bluray>
    </amazon>
</movie>

<movie movieID="2">
    <title>Lawless</title>
    <amazon>
        <dvd>B008OPZ83C</dvd>
        <bluray>B008OPZD8C</bluray>
    </amazon>
</movie>

</movies>

movies_list.xsl映画のタイトルをハイパーリンクとして表示し、ユーザーmovie_detailsがクリックした映画のタイトルとそれに対応する Amazon の DVD および Bluray 製品情報を表示できるページに移動します。

movie_list.xsl

<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: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> 

movie_details.phpAmazon API XML から映画情報 (DVD とブルーレイ) を検索して表示します。

$movies = file_get_contents('movies.xml');
$xml = new SimpleXmlElement($movies);

$movieId = $_GET['movieID'];
$movie = $xml->xpath("/movies/movie[@movieID = '$movieId']")[0];
if($movie) {
   $dvd = $movie->amazon->dvd;
   $bluray = $movie->amazon->bluray;

    $request = aws_signed_request('co.uk', array(
            'Operation' => 'ItemLookup',
            'ItemId' => $dvd.', '.$bluray,
            'ResponseGroup' => 'Medium, Offers',
            'MerchantId' => 'All'), $public_key, $private_key, $associate_tag); 

    $response = @file_get_contents($request);

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

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

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

    $params = $_GET['movieID'];
    $proc->setParameter('', 'movieID', $params);

    echo $proc->transformToXML($xml2);

}

実際の ItemId 値を配列にハードコードする代わりに、ローカルmovies.xmlファイルに保存されている DVD と Bluray の ItemId を検索する $dvd 変数と $bluray 変数を作成しました。

これは、movie_details.xslすべての映画の詳細情報を表示する私のファイルです: タイトル (movies.xml から) と Amazon DVD と Bluray の写真 (Amazon API から):

<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="moviesXML" select="document('movies.xml')"/>

<xsl:param name="movieID"/>

<xsl:template match="/">
    <xsl:element name="html">
        <xsl:element name="head">
            <title>Movie details</title>
        </xsl:element>
        <xsl:element name="body">  
            <xsl:apply-templates select="$moviesXML/movies/movie[@movieID=$movieID]" />
        </xsl:element>
    </xsl:element>
</xsl:template>

<xsl:template match="movie">
        <xsl:value-of select="title"/>
        <xsl:element name="br" />
        <xsl:apply-templates select="../aws:ItemLookupResponse/aws:Items/aws:Item/aws:MediumImage/aws:URL"/>
</xsl:template>

<xsl:template match="aws:URL">
    <xsl:element name="img">
        <xsl:attribute name="src">
            <xsl:value-of select="." />
        </xsl:attribute>
    </xsl:element>
    <xsl:element name="br" />
</xsl:template>

</xsl:stylesheet>

movies_listユーザーがページでクリックした映画のタイトルに基づいて、movie_detailsその特定の映画のタイトルとそれに対応する Amazon DVD およびブルーレイの URL (製品のカバー画像へのリンク) を表示するページに移動する必要があります。画像として表示されます。

movie_detailsユーザーがページでクリックした映画のタイトルに基づいて、ページに表示される映画のタイトルを取得しmovies_listます。

ただし、どこに置く必要があるのか​​ わかりません:

<xsl:apply-templates select="../aws:ItemLookupResponse/aws:Items/aws:Item/aws:MediumImage/aws:URL"/>

その映画の Amazon DVD とブルーレイの製品情報も表示します。

私が達成したい最終結果:

画面

Movie ID 2 は、Dark Knight の代わりに Lawless 映画情報を表示することを除いて、同じように機能するはずです。

4

1 に答える 1

1

ここでできることの 1 つは、入力 XML のルートへの参照を格納することです。

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

次に、2 番目のテンプレートでこれを行うことができます。

<xsl:template match="movie">
    <xsl:value-of select="title"/>
    <xsl:element name="br" />
    <xsl:apply-templates 
       select="$inputRoot/aws:ItemLookupResponse/aws:Items
                 /aws:Item/aws:MediumImage/aws:URL"/>
</xsl:template>

Amazon API リクエストの DVD および Blu-Ray ID を取得する方法も変更する必要があるようです。

$movies = file_get_contents('movies.xml');
$xml = new SimpleXmlElement($movies);

$movieId = $_GET['movieID'];
$movieSelect = $xml->xpath("/movies/movie[@movieID = '$movieId']");
$movie = $movieSelect[0];
if($movie) {
   $dvd = $movie->amazon->dvd;
   $bluray = $movie->amazon->bluray;

   // the rest of your code
}
于 2013-04-01T19:57:58.930 に答える