2015-11-11 62 views
0

我創建了一個下拉選擇框,用於選擇要查看的相冊。當用戶進行選擇時,他們然後單擊查看相冊,並且他們所做的選擇的ID通過POST發送到查看頁面:select_album.php使用模板匹配選擇相冊

從數據庫中查詢所有相冊的列表,並顯示在下拉選擇。每張專輯都有一個與其關聯的ID。根據選擇哪個專輯,當用戶點擊查看專輯時,它們將被髮送到select_album.php,其中顯示該專輯的信息。

下拉列表中的默認選擇是[SELECT ALBUM],僅用作佔位符。我的問題是,當選擇[SELECT ALBUM]並單擊View Album時,用戶將被髮送到select_album.php並看到空白頁面。我需要頁面顯示專輯信息:NO ARTIST:NO ALBUM TITLE Label:NO LABEL,0 TRACKS等。我將顯示一張沒有專輯封面的專輯圖片。

我想我需要做的是以某種方式做一個模板匹配,但我很困惑從哪裏開始。

This is the dropdown This is example of a regular album page

select_album.php

<?php 
$sql = "SELECT * from albums ORDER BY artist"; 
     $result = $conn->query($sql); 

     if ($result->num_rows > 0) { 
     // output data of each row 

?> 
<form method='POST' action='write_xml.php'><b>SELECT AN ALBUM TO VIEW:</b><br /> 
<select name='id' size=1> 
<option value=''>[SELECT ALBUM]</option> 
<?php 
     while($row = $result->fetch_assoc()) { 
?> 
<option value="<?php echo $row['id']; ?>"><?php echo $row['artist']. ' - ' .$row['name']; ?></option> 
<?php 
     } 
     } else { 
     echo "0 results"; 
     } 
     $conn->close(); 
?> 
</select><br /><br /> 

<input type='submit' name='process' value='VIEW ALBUM' /> 

music_inventory.xsl

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" > 
<xsl:output method="xml" /> 

<xsl:param name="albumid">JA1</xsl:param> 
<xsl:template match="/"> 

    <html> 
     <body> 
      <xsl:apply-templates/> 
     </body> 
    </html> 
</xsl:template> 
<xsl:template match="music_inventory"> 
    <xsl:apply-templates select="album[@id=$albumid]"/> 
</xsl:template> 
<!--creates hyperlink--> 
<xsl:template match="album"> 
<img src="{@albumart}" style="position: absolute; left: 10px; top: 10px; width: 200px;" /> 

    <div style="position: absolute; left: 215px; font-size: 16pt; color: #993333;"> 

     <b><xsl:value-of select="artist"/>: <a xmlns="http://www.w3.org/1999/xhtml" href="{@id}.xhtml"> 
      <xsl:value-of select="name"/> 
     </a></b> 

    </div> 
    <div style="position: absolute; left: 215px; top: 40px; font-size: 10pt;"> 
    <b>Label: </b><xsl:value-of select="label"/><br /> 
    <b>Year: </b><xsl:value-of select="year"/><br /> 
    <b>Disc <xsl:value-of select="disc"/> of <xsl:value-of select="totaldiscs"/></b><br /> 
</div> 

<div style="position: absolute; left: 215px; top: 100px; font-size: 12pt;"> 
    <b>Track Listing:</b><br/> 
    <xsl:for-each select="tracklist/*"> 
     <xsl:apply-templates select="@id"/>: <xsl:value-of select="."/><br /> 
    </xsl:for-each> 
</div> 

</xsl:template> 

write_xml.php

$query="select * from albums"; 
$result=mysqli_query($db,$query); 

$fp=fopen('music_inventory.xml','w'); 
$header="<?xml version=\"1.0\"?>\n<!DOCTYPE album SYSTEM \"music_inventory.dtd\">\n"; 
$header.="<?xml-stylesheet type=\"text/css\" href=\"music_inventory.css\"?>\n"; 
$header.="<music_inventory>\n"; 
$written=fwrite($fp,$header); 

$xml_data=""; 


while($row=mysqli_fetch_array($result)) 

{ 
    // Insert code here to write the outer album info 
    $type=null; 
$xml_data .= "<album id=\"".$row['id']."\" type=\"".$type."\" albumart=\"" .$row['albumart']."\">"; 
$xml_data .= "<artist>".htmlentities($row['artist'])."</artist>\n"; 
$xml_data .= "<name>".$row['name']."</name>\n"; 
$xml_data .= "<year>".$row['year']."</year>\n"; 
$xml_data .= "<label>".$row['label']."</label>\n"; 
$xml_data .= "<disc>".$row['disc']."</disc>\n"; 
$xml_data .= "<totaldiscs>".$row['totaldiscs']."</totaldiscs>\n"; 



    switch($row["type"]) 
    { 
      case 'E': 
        $type='EP'; 
        break; 
      case 'F': 
        $type='full_length'; 
        break; 
      case 'S': 
        $type='soundtrack'; 
        break; 
      case 'C': 
        $type='compilation'; 
        break; 
      case 'M': 
        $type='multi_disc'; 
        break; 
      default: 
        $type='unknown'; 
        break; 
    } 


      $xml_data .= "<tracklist>\n";  


    $track_query="select track_number,track_title,track_artist from tracklist where id='" . $row["id"] . "' order by track_number"; 
    $track_result=mysqli_query($db,$track_query); 
    while($track_row=mysqli_fetch_array($track_result)) 
    { 
      // Insert code here to write the inner track list info 
      $xml_data .= "<track id=\"".$track_row['track_number']."\">".htmlentities($track_row['track_title'])."</track>\n"; 

    } 


    $xml_data .= "</tracklist>\n"; 
    $xml_data .= "</album>\n"; 

} 





$written=fwrite($fp,$xml_data); 
$footer="</music_inventory>\n"; 
$written=fwrite($fp,$footer); 
fclose($fp); 

$xslDoc = new DOMDocument(); 
$xslDoc->load("music_inventory.xsl"); 

$xmlDoc = new DOMDocument(); 
$xmlDoc->load("music_inventory.xml"); 

$proc = new XSLTProcessor(); 
$proc->importStylesheet($xslDoc); 

$proc->setParameter('', 'albumid', $_POST["id"]); 

echo $proc->transformToXML($xmlDoc); 

?> 

回答

0

在你的XSLT,您目前選擇的專輯,像這樣的模板:

<xsl:template match="music_inventory"> 
    <xsl:apply-templates select="album[@id=$albumid]"/> 
</xsl:template> 

如果要處理這種情況$albumid是空的情況下,你可以添加之後的條件爲xsl:if

<xsl:template match="music_inventory"> 
    <xsl:apply-templates select="album[@id=$albumid]"/> 
    <xsl:if test="$albumid = ''"> 
     <p>NO ALBUM</p> 
    </xsl:if> 
</xsl:template> 

或者,也許就是這樣,來處理在$albumid設置,但不存在的情況下:

<xsl:template match="music_inventory"> 
    <xsl:variable name="$album" select="album[@id=$albumid]" /> 
    <xsl:apply-templates select="$album"/> 
    <xsl:if test="$album"> 
     <p>NO ALBUM</p> 
    </xsl:if> 
</xsl:template> 

當然,另一種解決方案是簡單地禁用「瀏覽相冊」按鈕,只要選擇「SELECT ALBUM」,就可以避免不必要的回傳。

+0

謝謝Tim!只有一個小錯字:您有

+0

謝謝!我在回答中糾正了錯字。 –