2013-03-21 60 views
1

我有兩個不同的XML文件重複:movies.xml和亞馬遜商品廣告API XMLXSLT - 轉換兩種不同的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> 

申請模板選擇=「/電影/電影 - 從movies.xml載荷的5部電影列表,並將其顯示爲超鏈接

申請模板選擇=」 AWS:ItemLoo kupResponse/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> 

正如你可以看到這兩個模板都顯示這將導致顯示兩次兩個模板磁頭組件「電影榜」不同的HTML標籤。

如果我能以某種方式將這兩個模板放到一個HTML元素中,那麼不會有任何重複。我嘗試過幾種方法,但還沒有成功。

這是我的PHP文件,它創建兩個XML文件和一個XSLT樣式表。它還會爲亞馬遜產品生成一個簽名的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); 

} 

movies.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> 

亞馬遜產品廣告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> 

瀏覽器輸出:

browser

+0

亞歷克斯,同時顯示XML的文件的一些片斷...... – michi 2013-03-21 22:45:32

+0

我已經更新我的職務與XML文件 – Alex 2013-03-21 23:05:31

回答

1

我不能重現問題

隨着您的XSLT代碼(略微改變爲訪問「電影。XML 「通過調用document()功能):

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

時所提供的亞馬遜產品廣告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> 

,並具有提供的XML文檔(文件」 的電影。 x:「)在本地目錄」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> 

改造產生以下結果,那裏是沒有的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> 
+0

感謝您的回覆,Dimitre。我已經加倍檢查了所有內容,並且仍然得到了每個元素中包含head元素的html元素的副本。我認爲我的PHP代碼導致了這個問題,因爲我正在創建並回顯兩個單獨的xml文件。它們可能互相覆蓋並導致所有html標記重複。我用我的瀏覽器顯示的圖像更新了我的帖子。 – Alex 2013-03-22 04:36:49

+0

@Alex,我已經對這個答案和我正在使用的所有11種不同的XSLT處理器進行了轉換 - 它們都產生了相同的正確結果。如果您使用的是兼容的XSLT處理器,那麼唯一的原因可能是至少有一個XML文檔或轉換本身與此答案中使用的不同。 – 2013-03-22 05:00:35

+1

@Alex,在使用'document()'添加對「movies.xml」的訪問後,是否從PHP中刪除了'echo $ proc-> transformToXML($ xml);'?您正在運行2個獨立的轉換。您只需在「$ response」XML上運行轉換即可。 – 2013-03-22 05:06:10

1

看來XSLTProcessor不允許您將XML內容設置爲參數(setParameter函數只接受一個字符串),因此您需要使用XSLT document函數來處理多個輸入文檔,如前所述herehere。您將需要保存您的從亞馬遜在文件系統中的文件的響應,那麼你的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> 

編輯:代碼修改爲按您的評論我的原始答案,並刪除了關於「多對一」問題的語言。

+0

謝謝你你的回覆,Jollymorphic。我已經應用您的解決方案,但不幸的是,我仍然得到重複的「電影列表」H2標記。也許我沒有正確解釋我的問題,但我只想顯示「電影列表」標題文本,然後列出5個超鏈接電影標題,然後顯示下面的「黑暗騎士亞馬遜電影標題」。我不想在5部電影標題和亞馬遜標題之間有任何關係,我只是試圖在我的電影列表頁面中包含亞馬遜api,並看看它將如何工作。我想要的只是將其顯示在一個沒有「電影列表」標題的HTML標籤中。 – Alex 2013-03-22 01:29:55