2013-11-27 121 views
-1

我已經查看了所有的谷歌,並無法弄清楚如何正確實現這一點。這要麼根本不可能,要麼我錯過了某種語法?自從我完成JavaScript以來,這已經很長時間了,所以我可能會錯過一些非常簡單的事情。xsl:在javascript函數中調用模板

我使用<xsl:text disabled-output-escaping="yes"><![CDATA[並使用XML 1.0將一些JavaScript嵌入到XSL文件中。

所以我有這樣的事情:

function seconds(s) { 
     s = s/60; 

     document.write(s + " "); 
     if (s > 2) { 
      document.write(s + " " + '<xsl:call-template name="resources"><xsl:with-param name="res" select="minutes"/></xsl:call-template>'); 
     } 
     else { 
      document.write(s + " " + '<xsl:call-template name="resources"><xsl:with-param name="res" select="minute"/></xsl:call-template>'); 
     } 
    } 

所以,這是怎麼回事的是,我給秒的「60」變量「s」的增量。我需要計算到分鐘,但是,我需要調用模板來實際輸出「分鐘」或「分鐘」字符串。我知道call-template在XSL中起作用。但是,當我將它嵌入到JavaScript中時,它不顯示「分鐘」或「分鐘」。它只會顯示更正的整數和空間。

我該如何將這個xsl行嵌入到JavaScript中,還是完全可能?

編輯: 所以我會嘗試澄清更多。 XML文件上的數據並不重要。我想我的問題是,對於document.write行來說,將xxl代碼嵌入到其中是有問題的。因爲它實際上不打印任何模板打印的內容(基本上是將「分鐘/分鐘」一詞翻譯成用戶選擇的任何語言,或者如果語言不存在,則默認爲英語,因此不重要。需要知道document.write行的語法有什麼問題,以防止顯示XSL代碼,或者可以將它嵌入到JavaScript中嗎?所有的JavaScript都是通過CDATA封裝在.xsl文件中完成的。希望這更加明確了它

+0

你是不是想以編程寫使用XSLT從XML文檔的JavaScript,或者你想從JavaScript調用的XSLT模板?您能否包含示例XML文檔和更完整的XSLT? – 2013-11-27 02:38:31

+0

增加了更多的說明,希望你能幫助我檢查語法或者這種類型的嵌入是否可行。 – misterbear

+0

您不能在Javascript中運行單個XSL命令。你需要包含更多的代碼(如果有的話),並真正考慮你想要做什麼。 – 2013-11-27 04:09:21

回答

2

你的問題是有點混亂,因爲它給你試圖調用XSL的印象:。模板使用Javascript,這是不可能的,但我想你實際上是在說什麼您試圖在XSLT中調用模板,作爲輸出一些恰好是java的文本的一部分腳本以供稍後在瀏覽器中使用。

的原因是沒有工作是因爲你在你的問題,你是outputing的JavaScript文本由本所包圍......

<xsl:text disabled-output-escaping="yes"><![CDATA[ 
    ... Javascript code here.. 
]]></xsl:text> 

尤其是使用CDATA標籤意味着XSLT將其中的所有內容視爲未分離的文本,因此,如果您碰巧有一些使用xslt語法的文本,則無關緊要。它只是被視爲任何其他文字。

你可以做些什麼來解決這個問題,是在每個xsl:call-template之前關閉CDATA,然後重新打開它。這樣

<xsl:text disable-output-escaping="yes"><![CDATA[ 
function seconds(s) { 
    s = s/60; 

    document.write(s + " "); 
    if (s > 2) { 
     document.write(s + " " + ']]></xsl:text> 
      <xsl:call-template name="resources"><xsl:with-param name="res" select="'minutes'"/></xsl:call-template> 
      <xsl:text disable-output-escaping="yes"><![CDATA['); 
    } 
    else { 
     document.write(s + " " + ']]></xsl:text> 
      <xsl:call-template name="resources"><xsl:with-param name="res" select="'minute'"/></xsl:call-template> 
      <xsl:text disable-output-escaping="yes"><![CDATA['); 
    } 
} 
    ]]> 
    </xsl:text>  

什麼的也許是略低整潔與最XSL做掉:文本CDATA標籤,並且只使用它們包圍包含任何「逃離」字符的字符。

<xsl:template name="outputSeconds"> 
function seconds(s) { 
    s = s/60; 

    document.write(s + " "); 
    if (s <xsl:text disable-output-escaping="yes">&gt;</xsl:text> 2) { 
     document.write(s + " " + '<xsl:call-template name="resources"><xsl:with-param name="res" select="'minutes'"/></xsl:call-template>'); 
    } 
    else { 
     document.write(s + " " + '<xsl:call-template name="resources"><xsl:with-param name="res" select="'minute'"/></xsl:call-template>'); 
    } 
} 
</xsl:template> 

有兩點需要注意:

1)在你的問題你指的「禁用輸出轉義」時,它應該是「禁用輸出轉義」

2)如果您用參數調用「resources」模板,如果你想傳入一個字符串值,而不是一個節點的值,用撇號括起來; <xsl:with-param name="res" select="'minute'"/>

+0

非常感謝您的幫助。我不知道<![CDATA [可能剛剛結束並繼續處於JavaScript行中。我還沒有很多使用多種語言的經驗。但是這增加了我的知識工具箱。再次感謝蒂姆! – misterbear

+1

從XSLT的角度來看,它不是JavaScript,它只是輸出一些文本用於其他用途。你可以在你喜歡的地方開始和結束CDATA! –