2011-04-13 87 views
1

我真的很陌生,很抱歉,如果這聽起來很愚蠢或愚蠢。我們有一個新項目提出一個新的網頁。我有一個多條件if語句,並且想要在條件滿足時調用xsl模板。以下是我現在擁有它的方式,它根本不起作用。xsl:在javascript函數中調用模板?

<script> 
function getSelectedValue() 
{ 
if("document.getElementById('type').value==1 and document.getElementById('cablegroup5').value==9"+ 
"document.getElementById('cablegroup3').value==22 and document.getElementById('cablelength').value==11") 
{ 
<xsl:call-template name="PN"> 
<xsl:with-param name="Cable">ABC111-06</xsl:with-param> 
</xsl:call-template> 
} 
} 
</script> 

我知道第一部分的作品,我用一條警告信息測試過,並且工作得很好。這些都通過多個下拉菜單旁邊的按鈕(onclick)來激活。有沒有辦法讓這個工作?任何幫助將非常感激。謝謝。

+0

當你傳遞一個字符串時,if語句中的子句總是會計算爲「true」。你實際上沒有測試節點。你想要對網頁執行變換還是你有一個單獨的XML文檔?如果你正在對由'document'表示的文檔執行轉換,那麼你是否可以使用JavaScript DOM完成相同的操作? – detaylor 2011-04-13 14:35:12

+0

我有一個單獨的xml文檔。我想打電話給我的訪問數據庫中附加的ABC111-06信息。 if語句來自下拉菜單選項。如果第一個下拉菜單的值爲1,第二個下拉菜單的值爲9,第三個下拉菜單的值爲22,第四個下拉菜單的值爲11,則顯示來自數據庫@ ABC111-06的文本。我會研究JavaScript DOM,對不起,就像我之前提到的,我對這些都很陌生。謝謝。 – Charles 2011-04-13 15:40:12

+0

從XSLT轉換的角度來看,這僅僅是圍繞命名模板調用的文本。從瀏覽器的角度來看,我不認爲這些XSLT元素是有效的JavaScript代碼。如果您想從JavaScript代碼**運行轉換**,您需要知道如何invoque您的XSLT處理器。在XSLT 1.0中,執行上下文中沒有關於起始命名模板的信息。在XSLT 2.0中,信息是precense,但是如何聲明依賴於XSLT處理器API。您可能會對Beta Saxon JavaScript XSLT 2.0處理器感興趣。 – 2011-04-13 16:18:12

回答

0

您對處理模型感到困惑。腳本元素是否由XSLT生成?如果是這樣,呼叫模板可能會在腳本生成時被調用。它不會在腳本執行時被調用。 Javascript代碼不會奇蹟般地執行XSLT指令。

0

腳本中有幾個問題會阻止if語句正確執行。

  1. JavaScript中的布爾值和運算符是&&而不是and。請注意,如果您使用&這將是一個按位和。
  2. 測試不應該是字符串。由於JavaScript類型轉換,它將一個字符串轉換爲布爾值。 A null或空字符串''將評估false,所有其他字符串將評估true。目前,你有

    if("test1 and test2") 
    

    這應該是

    if(test1 && test2) 
    

到目前爲止,您的更新腳本將

<script> 
    function getSelectedValue() 
    { 
    if(document.getElementById('type').value==1 && 
    document.getElementById('cablegroup5').value==9 && 
    document.getElementById('cablegroup3').value==22 && 
    document.getElementById('cablelength').value == 11) 
    { 
     // Process Xml 
    } 
    } 
</script> 

您需要使用瀏覽器的XML解析器來處理你的XML。我假定你有一個xml字符串,如果你有一個文檔對象,那麼你將不得不稍微改變以下內容,這是從w3schools

var xmlString = "<Products>" + 
        "<Product partnumber='foo'>This is product 1</Product>" + 
        "<Product partnumber='bar'>This is product 2</Product>" + 
        "</Products>"; 
    // Load into an XML document 
    var myDoc; 
    if (window.DOMParser) 
    { 
    var parser=new DOMParser(); 
    myDoc=parser.parseFromString(xmlString,"text/xml"); 
    } 
    else // Internet Explorer 
    { 
    myDoc=new ActiveXObject("Microsoft.XMLDOM"); 
    myDoc.async="false"; 
    myDoc.loadXML(xmlString); 
    } 

    // Get all product nodes 
    var products = myDoc.getElementsByTagName('Product'); 
    var i, targetProduct, partNumber; 

    for(i = 0; i < products.length; i += 1){ 
    // Get the partnumber attribute 
    partnumber = products[i].attributes.getNamedItem('partnumber'); 

    // Ensure that the partnumber exists and its value is what is wanted 
    if(partnumber && partnumber.value == 'foo'){ 
     targetProduct = products[i]; 
     // Exit for 
     break; 
    } 
    } 

    // If the product has been found alert its value. 
    if(targetProduct != null){ 
    alert(targetProduct.textContent || targetProduct.text); 
    } 

如果您選擇通過ID的節點,那麼你可以使用xmlDoc.getElementById,而不是通過一個類型的所有節點迭代和檢查屬性。

要選擇xml節點的文本值,儘管Internet Explorer使用text,但大多數瀏覽器使用屬性textContent。行

targetProduct.textContent || targetProduct.text 

textContent返回它是否存在並且非空,或者text值。

+0

哇,我可能會在我的頭上,我真的沒有想到它會那麼複雜。我必須研究你提供的東西,你最有幫助。我第一次嘗試&&時,我最終使用了和(即「test1和test2」),因爲當我使用&符號時,它說「Character'&',十六進制值0x26在XML名稱中是非法的。當我測試「和」,它的工作,所以我恢復了。我對w3schools非常熟悉,實際上我每天花幾個小時試圖解決這個問題。再次感謝 – Charles 2011-04-14 16:57:48

+0

@Charles。您的腳本是否在HTML文檔中?有關XML名稱中的&的錯誤聽起來很奇怪。在過去使用xslt和xpath而不使用JavaScript時有過的東西。 – detaylor 2011-04-14 20:16:03

+0

嗯,我想我應該包括那個 - 它在.xsl上。我不得不使用「和」作爲逃跑鍵 – Charles 2011-04-14 20:50:48