我意识到我可能会后悔在我的余生中询问这个问题,但是......有没有办法将XSLT应用于XML文件而不用具有明确引用的XML文件到XSLT文件?
就个人而言,我认为XSLT的整个点是你可以对同一个原始XML文件应用几种不同的转换,从而产生几个不同的结果。但是,如果必须在源XML文件中指定转换,那么这确实不起作用。似乎要改变转换,你必须改变底层原始数据文件,这似乎是错误的......
那么有没有办法创建某种文件,说“采用这种XML和XSLT并在浏览器窗口中呈现结果”?
修改
也许我的问题不清楚。
如果我打开记事本,编写XML文件,并在其中提及XSLT文件的名称,那么当我双击XML文件时,Web浏览器将应用指定的XSLT。有没有什么方法可以说服浏览器在没有更改原始XML文件的情况下执行此操作?或者我将被迫搜索命令行XSLT处理器?
答案 0 :(得分:17)
是否有某种方法可以在没有XML文件的情况下将XSLT应用于XML文件 有明确的XSLT文件引用?
当然。事实上,XSLT规范完全不依赖(提及)XML文件,该文件具有对XSLT样式表的引用来处理它。
因此,可以通过许多不同的XSLT转换来处理相同的XML文件。
在XSLT 2.0及更高版本中,XSLT转换甚至不需要应用相应的XML文档。
如何做到这一点?
简短回答:这是依赖于实现的 - 阅读相应的XSLT处理器文档(例如XslCompiledTransform for .NET,Saxonica for Saxon,...等)。
此外,几乎每个XSLT处理器都有一个用于从控制台窗口调用转换的命令行实用程序 - 再次查看相应的文档( msxsl.exe 对于MSXML,nxslt.exe用于XslCompiledTransform,...等。)
以下是我正在使用的XSLT处理器的一些命令行:
这将调用MSXML 3处理器:
msxsl.exe %xml% %xsl% -o %out% -u '3.0' -t %param[ name="value"]%
这将调用MSXML 4处理器:
msxsl.exe %xml% %xsl% -o %out% -u '4.0' -t %param[ name="value"]%
这将调用MSXML 6处理器:
msxsl.exe %xml% %xsl% -o %out% -u '6.0' -t %param[ name="value"]%
这将调用.NET XslCompiledTransform:
nxslt2.exe %xml% %xsl% -t -o %out% %param[ name="value"]%
这为XSLT 10调用AltovaXML(XML-SPY):
AltovaXML.exe -xslt1 %xsl% -in %xml% -out %out%%param[ name="value"]%
这为XSLT 2.0调用AltovaXML(XML-SPY):
AltovaXML.exe -xslt2 %xsl% -in %xml% -out %out%%param[ name="value"]%
这会调用Saxon 9.x(对于XSLT 2.0):
java.exe -Xms512M -Xmx512M -jar C:\xml\Parsers\Saxon\Ver.9.1.0.5\J\saxon9.jar -t -repeat:1 -o %out% %xml% %xsl% %param[ name=\"value\"]%
这会调用XQSharp(XSLT 2.0):
XSLT.exe -s %xml% -o %out% -r 1 -t %xsl% %param[ name="value"]%
在上述所有内容中,%xml%
是XML文件的路径,%xsl%
是主XSLT文件的路径,%out%
是包含该文件的路径转型的输出。
%param[ name="value"]%
是name = value
参数规范的列表,这不是必须使用的。
答案 1 :(得分:1)
为什么当然! :)
您只需调用所需的XSLT处理器(至少)提供要使用的XSLT和XML文件。事实上,在内部这就是Internet Explorer等应用程序在检测到XML文档引用了XSLT文件时所做的事情。
如何执行此操作取决于您的环境,例如command line XSLT processors,您还可以在大多数编程语言中应用XSLT,例如: Applying an XSLT using C#
答案 2 :(得分:1)
这里的简单方法
http://www.devguru.com/content/technologies/xml_dom/16058.html
此方法支持独立样式表和嵌入样式表,并且还提供针对特定源节点运行本地化样式表片段的功能。
此方法使用指定的XSL样式表处理此节点及其后代,并返回生成的转换。
<html>
<head>
<script>
xmldoc = new ActiveXObject("Microsoft.XMLDOM");
xmldoc.async = false;
xmldoc.load("xmldoc.xml");
xsldoc = new ActiveXObject("Microsoft.XMLDOM");
xsldoc.async = false;
xsldoc.load("xsldoc.XSL");
</script>
<script>
document.write(xmldoc.transformNode(xsldoc));
</script>
</head>
<body>
答案 3 :(得分:0)
是的,有可能。所有XSL-T实现都有API来对XML文件执行XSL-T转换。
答案 4 :(得分:0)
好吧,看来你正在寻找某种现成的解决方案。而不是编写Java或.NET代码来在XML文件上运行XSLT。在Java世界中,有http://en.wikipedia.org/wiki/Apache_Cocoon库允许这样做。
答案 5 :(得分:0)
响应OP的编辑要求,从浏览器中选择不同的XSLT。
在回答之前我没有做过任何调查,但当IE是镇上唯一的实用游戏时,我记得在浏览器中有一个默认的CSS应用于XML文件。由于CSS和XSLT文件是在带有处理指令的文档中指定的,可能会有一些方法通过插件/扩展来任意覆盖浏览器的默认样式表 - 假设其他浏览器以类似的方式处理它?</ p>
或者可能有办法动态地将处理指令添加到文档并刷新吗?
答案 6 :(得分:0)
所有回答这个问题的人(包括我)似乎都不确定你究竟在问什么。由于您还没有将任何答案标记为正确,我将继续说明您可能正在寻找的是HTML / AJAX(异步JavaScript和XML)解决方案。这样,您可以告诉浏览器根据特定条件使用不同的XSLT样式表(例如,浏览器是IE,或者日期是新年等)。
我不会在这里粘贴代码,而是会指向一篇博文,我相信它完全涵盖了您所寻找的内容(您需要自己添加条件):http://johanlouwers.blogspot.co.uk/2011/05/render-xml-into-div-using-ajax-and-xsl.html
注意:上面的示例使用了两个XML Docs&amp;一个XSLT样式表,但可以很容易地适应使用两个样式表和&amp;一个XML文档。
注意:如果您运行该示例,请直接使用您的浏览器执行此操作,因为我发现从WebStrom等IDE启动test.html文件会导致在单击链接时发生注意。
如果这回答了您的问题(或者最接近回答),请将其标记为所选答案,以便将此帖子列为已解决。