我正在通过客户端提供的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);
};
答案 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。 inputXml
和xslt
都是XML文档。