在XSL,客户端访问JavaScript变量

时间:2011-06-21 18:23:24

标签: javascript xml xslt sharepoint-2007

我正在通过客户端提供的WebServices从SharePoint 2007系统创建报告(这完全归功于开发人员的限制 - 我知道,如果我获得了许可,那么整个练习在SharePoint设计器中将非常简单)

目前我有一份工作报告。在JavaScript中,我传递了三个参数(“从”日期,“到”日期和“业务类别”),这三个参数用于生成对Web服务的CAML查询。返回XML响应并(在进行一些格式化清理之后)导入XSLT(外部文件)并直接应用于它,并将结果泵入页面上的DIV。一切顺利。

此时我想在报告中实际显示输入参数(日期和类别)。我至少有两个kludgy选项可以做到这一点:

1)输出显示器DIV之外的值。这可行,但不是很有效。

2)输出XSL中值的占位符,然后在显示之前运行一系列替换。这只是感觉......奇怪。

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);

};

1 个答案:

答案 0 :(得分:0)

您可以在javascript中将参数传递给XSLT,只需输入

即可

<xsl:param name="myparam" />

在样式表的根目录中。在javascript中查看setParameter对象上的XSLTProcessor方法。这是我使用的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中的其他地方定义,它不是标准库的一部分。