[英]Accessing JavaScript Variables in XSL, Client-Side
我正在通過客戶端上提供的WebServices從SharePoint 2007系統創建報告(這完全是由於開發人員的限制-我知道,如果我獲得許可,則整個練習在SharePoint Designer中將非常簡單)。
目前,我有一份工作報告。 在JavaScript中,我傳入了三個參數(“開始”日期,“到”日期和“業務類別”),這些參數用於生成對Web服務的CAML查詢。 返回XML響應,並(在進行某種格式的清理后)導入XSLT(外部文件)並將其直接應用到該XML響應,並將結果泵入頁面上的DIV。 一切正常。
但是,在這一點上,我想在報表上實際顯示輸入參數(日期和類別)。 我至少有兩個選擇可以做到這一點:
1)在顯示DIV之外輸出值。 這會起作用,但不是很實用。
2)在XSL中使用Ouput占位符表示值,然后在顯示之前進行一系列替換。 感覺真奇怪。
3)在轉換之前,將具有所需值的節點手動添加到XML數據包,然后在XSLT中正常訪問它們。 對我來說,這似乎是最干凈的……但也有一些不確定的行李。
是否有“正確”的方法來做到這一點? 這些機會之一嗎?
以下是一些(縮寫)代碼來說明:
// Set the URL of the XSL to apply
reportXSLURL = "BusinessCategoryReport.xsl";
// Set the input variables.
var CurCategory = DP_QueryString.get("ForCategory", "first");
var CurFrom = DP_QueryString.get("ForFrom", "first");
var CurTo = DP_QueryString.get("ForTo", "first");
* * Soap Call Censored (Too Hot for the Internet) * *
// Load the data
function ProcessResponse(ResponseText) {
// Create and load the serviceXML
var serviceXML = new DP_XML();
serviceXML.parse(ResponseText);
// Create and Load the XSL
var reportXSL = new DP_XML();
reportXSL.load(reportXSLURL);
// Clean Up
CleanSharePointColumn(serviceXML.Doc, "ows_Duration", "CalculatedField");
CleanSharePointColumn(serviceXML.Doc, "ows_Incident_x0020_Manager_x0028_s_x", "UserList");
CleanSharePointColumn(serviceXML.Doc, "ows_Application_x0020__x0028_EAI_x00", "LookupList");
CleanSharePointColumn(serviceXML.Doc, "ows_Business_x0020_Category", "LookupList");
CleanSharePointColumn(serviceXML.Doc, "ows_Incident_x0020_Start", "DateTime_Min");
CleanSharePointColumn(serviceXML.Doc, "ows_Incident_x0020_End", "DateTime_Min");
// Present the Results
document.getElementById("DataDisplay").innerHTML = serviceXML.Doc.transformNode(reportXSL.Doc);
};
您可以將參數傳遞給javascript中的XSLT,只需將
<xsl:param name="myparam" />
在樣式表的根目錄中。 在javascript中的XSLTProcessor
對象上查看setParameter
方法。 這是我使用的javascript方法:
function transform(inputXml, xslt) {
var xsltProcessor;
var toReturn;
if (window.XSLTProcessor) {
xsltProcessor = new XSLTProcessor();
xsltProcessor.importStylesheet(xslt);
if (arguments.length > 2 && arguments.length % 2 == 0) {
for (var i = 0; i < Math.floor((arguments.length)/2)-1; i++) {
xsltProcessor.setParameter(null, arguments[2*i+2],arguments[2*i+3]);
}
}
toReturn = xsltProcessor.transformToDocument(inputXml);
}
else if (window.ActiveXObject) {
toReturn = makeDocFromString(inputXml.transformNode(xslt));
}
else {
toReturn = "Unable to transform";
}
return toReturn;
}
前兩個參數之外的任何參數均被視為名稱/值對,並將其作為參數傳遞給xslt。 inputXml
和xslt
都是XML文檔。
編輯:剛注意到,我忘了提到此函數使用了一個輔助方法'makeDocFromString',該方法僅將XML文檔的源作為字符串輸入,並返回實際的XML文檔。 該函數在.js中的其他位置定義,不屬於標准庫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.