這是一種痛苦,但您也可以使用客戶端填充程序解決此問題,該填充程序可在瀏覽器中預加載任何xsl:import/xsl:include。
以下是TypeScript(基本上是靜態類型的JavaScript,編譯爲JavaScript),並且有幾個引用這些接口的引用。我沒有去掉它,但它似乎可以在Chrome中工作(不確定其他瀏覽器),並且應該足以讓任何人開始解決方案。
module DD.Render.DOM.XSLT {
export class StandardXSLTDOMTransformerFactory implements IXSLTDOMTransformerFactory {
constructor(private _domParser:DOMParser, private _document:Document) {
}
createTransformerFromPath<T>(xslPath: string, xmlTransformer: IStringTransformer<T>, onSuccess: (transformer: IParameterizedDOMTransformer<T>) => void, onFailure: (e: any) => void): void {
DD.Util.readXML(
xslPath,
(node: Node) => {
// look up any xsl:import or xsl:includes and pull those in too!
var onIncludesPreloaded =() => {
console.log(node);
var transformer = this.createTransformerFromNode(node, xmlTransformer);
onSuccess(transformer);
};
this.rewriteIncludes(xslPath, node, {}, onIncludesPreloaded, onFailure);
}, function (e: any) {
onFailure(e);
}
);
}
rewriteIncludes(path:string, node: Node, imported: { [_: string]: boolean }, onRewritten:()=>void, onFailure:(e:any)=>void): void {
var result;
var element = <Element>node;
var importNodes = element.querySelectorAll("import,include");
if (importNodes.length == 0) {
onRewritten();
result = false;
} else {
var rewrittenNodes = 0;
// load imports
for (var i = 0; i < importNodes.length; i++) {
var importElement = <Element>importNodes.item(i);
var href = importElement.getAttribute("href");
// TODO work out relative path
var relativePath = DD.Util.appendRelativePath(path, href);
console.log("importing " + href +" + "+path+" -> "+relativePath);
if (!imported[relativePath]) {
var e = importElement;
imported[relativePath] = true;
DD.Util.readXML(relativePath, (importedStylesheet: Node) => {
this.rewriteIncludes(relativePath, importedStylesheet, imported, function() {
// replace the import with this node (minus stylesheet container)
for (var j = 0; j < importedStylesheet.firstChild.childNodes.length; j++) {
var templateNode = importedStylesheet.firstChild.childNodes.item(j);
if (templateNode.nodeName.indexOf("template") >= 0) {
e.parentNode.insertBefore(templateNode, e);
}
}
e.parentNode.removeChild(e);
rewrittenNodes++;
if (rewrittenNodes == importNodes.length) {
if (onRewritten) {
onRewritten();
}
}
}, onFailure);
}, onFailure);
} else {
importElement.parentNode.removeChild(importElement);
}
}
result = true;
}
return result;
}
createTransformerFromNode<T>(xsl: Node, xmlTransformer: IStringTransformer<T>): IParameterizedDOMTransformer<T> {
var nodeTransformer = new DOMParserDOMTransformer(this._domParser, xmlTransformer);
var xsltProcessor = new XSLTProcessor();
xsltProcessor.importStylesheet(xsl);
return new StandardXSLTDOMTransformer<T>(xsltProcessor, nodeTransformer, this._document);
}
}
}
module DD.Util {
export function readXML(path: string, onSuccess: (node: Node) => void, onFailure: (e: any) => void) {
var xhr = new XMLHttpRequest();
xhr.onload = function() {
onSuccess(xhr.responseXML);
};
xhr.onerror = function (e: ErrorEvent) {
onFailure(e);
};
xhr.open("GET", path, true);
xhr.send(null);
}
export function appendRelativePath(originalPath: string, relativePath: string, originalPathIsDirectory?: boolean) {
if (originalPathIsDirectory == null) {
originalPathIsDirectory = originalPath.charAt(originalPath.length - 1) == '/';
}
if (!originalPathIsDirectory) {
// remove file imediately
var lastSlash = originalPath.lastIndexOf('/');
if (lastSlash >= 0) {
originalPath = originalPath.substring(0, lastSlash + 1);
} else {
originalPath = "";
}
}
var slashIndex = relativePath.indexOf('/');
if (slashIndex >= 0) {
var relativeDirectory = relativePath.substring(0, slashIndex + 1);
var relativeRemainder = relativePath.substring(slashIndex + 1);
if (relativeDirectory == "../") {
// trim off a directory on the original path
if (originalPath.charAt(originalPath.length - 1) == '/') {
originalPath = originalPath.substring(0, originalPath.length - 1);
}
var dirIndex = originalPath.lastIndexOf('/');
if (dirIndex >= 0) {
originalPath = originalPath.substring(0, dirIndex + 1);
} else {
originalPath = "";
}
} else {
// append to the original path
if (originalPath.charAt(originalPath.length - 1) != '/') {
originalPath += '/';
}
originalPath += relativeDirectory;
}
appendRelativePath(originalPath, relativeRemainder, true);
} else {
// append and be done
if (originalPath.charAt(originalPath.length - 1) != '/') {
originalPath += '/';
}
return originalPath + relativePath;
}
}
}
看起來只有在通過JavaScript運行轉換時才如此。正如你所看到的,我的XML/XSLT驅動的網站工作:www.aranedabienesraices.com.ar – 2010-09-06 19:35:03
嗨亞歷杭德羅,是的,這是通過JavaScript轉換。我需要通過javascript來做到這一點。 – 2010-09-06 19:45:59
user357812:請解釋:該鏈接與此問題有何關係? – jsalonen 2011-05-31 13:04:27