簡體   English   中英

在客戶端XSL中訪問JavaScript變量

[英]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。 inputXmlxslt都是XML文檔。

編輯:剛注意到,我忘了提到此函數使用了一個輔助方法'makeDocFromString',該方法僅將XML文檔的源作為字符串輸入,並返回實際的XML文檔。 該函數在.js中的其他位置定義,不屬於標准庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM