2014-12-05 130 views
0

我有一個XSLT文件,顯示CD的標題和藝術家名稱。我有3個模板,第一個模板顯示標題,第二個模板顯示藝術家名稱,第三個模板包含隱藏表格。隱藏表格使用複選框顯示。我想重用標題和藝術家模板,以便在第三個模板可見時將其顯示爲表格數據。XSLT:在另一個模板中重新使用模板

問題是第三個模板沒有顯示在瀏覽器上,因爲我不知道要分配給匹配屬性。任何幫助,高度讚賞。謝謝。

預期結果: http://oi61.tinypic.com/6ibkur.jpg [1] 的index.html

<html> 
<head> 
<script> 
function loadXMLDoc(filename) 
{ 
if (window.ActiveXObject) 
    { 
    xhttp = new ActiveXObject("Msxml2.XMLHTTP"); 
    } 
else 
    { 
    xhttp = new XMLHttpRequest(); 
    } 
xhttp.open("GET", filename, false); 
try {xhttp.responseType = "msxml-document"} catch(err) {} // Helping IE11 
xhttp.send(""); 
return xhttp.responseXML; 
} 

function displayResult() 
{ 
xml = loadXMLDoc("cdcatalog.xml"); 
xsl = loadXMLDoc("cdcatalog_apply.xsl"); 
// code for IE 
if (window.ActiveXObject || xhttp.responseType == "msxml-document") 
    { 
    ex = xml.transformNode(xsl); 
    document.getElementById("example").innerHTML = ex; 
    } 
// code for Chrome, Firefox, Opera, etc. 
else if (document.implementation && document.implementation.createDocument) 
    { 
    xsltProcessor = new XSLTProcessor(); 
    xsltProcessor.importStylesheet(xsl); 
    resultDocument = xsltProcessor.transformToFragment(xml, document); 
    document.getElementById("example").appendChild(resultDocument); 
    } 
} 
</script> 
</head> 
<body onload="displayResult()"> 
<div id="example" /> 
</body> 
</html> 

cdcatalog.xml

<?xml version="1.0" encoding="UTF-8"?> 

<catalog> 
    <cd> 
     <title>Empire Burlesque</title> 
     <artist>Bob Dylan</artist> 
    </cd> 
    <cd> 
     <title>Hide your heart</title> 
     <artist>Bonnie Tyler</artist> 
    </cd> 
    <cd> 
     <title>Greatest Hits</title> 
     <artist>Dolly Parton</artist> 
    </cd> 
</catalog> 

cdcatalog_apply.xsl

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

    <xsl:template match="/"> 
    <html> 
    <head> 
    <style type="text/css"> 

    .pdesc{ 
    display:none; 
    } 

    input[type=checkbox]:checked + .pdesc { 
     display: block; 
    } 

    </style> 
    </head> 
    <body> 

     <h1>CD Collection</h1> 
     <xsl:apply-templates select="catalog/cd"> 
     </xsl:apply-templates> 

    </body> 
    </html> 
    </xsl:template> 


    <xsl:template match="cd"> 
    <TR > 
    <xsl:apply-templates select="title"/> 
    <xsl:apply-templates select="artist"/> 
    </TR> 
    </xsl:template> 


    <xsl:template match="title" name="title"> 
    <p> 
    <xsl:value-of select="."/> 
    </p> 
    </xsl:template> 


    <xsl:template match="artist" name="artist"> 
    <p> 
    <xsl:value-of select="."/> 
    </p> 
    </xsl:template> 

    <xsl:template match="X"><!-- I don't know what to put in the match --> 
    <label >Show More</label> 
    <input type="checkbox" ></input> 

    <div class="pdesc"> 

    <h2>CD Details</h2> 

    <table border="1" > 
    <tr bgcolor="#9acd32"> 
     <th>Title</th> 
     <th>Artist</th> 
    <tr> 
     <td> <xsl:call-template name="title"/></td> 
     <td> <xsl:call-template name="artist"/></td> 
    </tr> 

    </tr> 
    </table> 

    </div> 
    </xsl:template> 


</xsl:stylesheet> 
+0

這裏的預期結果是什麼? – 2014-12-05 17:52:55

+0

嗨michael.hor257k,我已經更新了我的帖子,預期結果。所以當複選框被選中時,表格變得可見。 – user2994263 2014-12-05 18:05:52

+2

而不是在瀏覽器中顯示HTML的視圖,你可以告訴我們預期的輸出源代碼? – 2014-12-05 18:22:32

回答

0

你不能有兩個模板完全匹配相同的元素而沒有一些吸引力因此你不能在你的第三個模板中匹配「cd」。

什麼,你可以這樣雖然是給你的第三個模板「mode」屬性

<xsl:template match="cd" mode="hidden"> 

但是,你則需要有在您指定的模式的第二xsl:apply-templates

<xsl:apply-templates select="catalog/cd" /> 
<xsl:apply-templates select="catalog/cd" mode="hidden" /> 

或許你可以把它在符合「CD」當前模板:

<xsl:template match="cd"> 
    <TR> 
     <xsl:apply-templates select="title"/> 
     <xsl:apply-templates select="artist"/> 
     <xsl:apply-templates select="." mode="hidden" /> 
    </TR> 
</xsl:template> 

注意,在這個「隱藏」的模板,你並不真的需要做xsl:call-templates你目前正在做。您可以在第一個模板中再次執行<xsl:apply-templates select="title"/>

或者,您可以刪除第一個模板,並使用xsl:for-each而不是第一個<xsl:apply-templates select="cd">。這將消除對「模式」屬性的需求。

<xsl:for-each select="catalog/cd"> 
    <TR> 
     <xsl:apply-templates select="title"/> 
     <xsl:apply-templates select="artist"/> 
     <xsl:apply-templates select="." /> 
     </TR> 
</xsl:for-each> 

當然,你真的需要兩個模板嗎?你不能把它們合併成一個嗎?

<xsl:template match="cd"> 
    <p> 
     <xsl:apply-templates select="title"/> 
     <xsl:apply-templates select="artist"/> 
    </p> 
    <label>Show More</label> 
    <input type="checkbox" /> 
    <div class="pdesc"> 
     <h2>CD Details</h2> 

     <table border="1" > 
     <tr bgcolor="#9acd32"> 
      <th>Title</th> 
      <th>Artist</th> 
     <tr> 
      <td><xsl:apply-templates select="title"/></td> 
      <td><xsl:apply-templates select="artist"/></td> 
     </tr> 
     </tr> 
     </table> 
    </div> 
</xsl:template> 
相關問題