我有一个大型的XSLT样式表,可以将XML格式转换为HTML格式。我想在输入XML文件中添加对XInclude的支持。目标是每个包含文件可以独立进行XSD验证,以及包含XML文件。我已经控制了XML模式中的所有更改(我认为);只有特定的XML元素可以移出来包含文件,并且只有一个级别的包含文件嵌套。我在Eclipse的XML编辑器中工作,很好地验证了包含文件和每个包含文件。
XSLT样式表有两种使用方式,在这里我们更接近我的问题:
在构建环境中,Python脚本使用lxml进行XSLT转换。 Python脚本集成到基于make的构建环境和Eclipse的Ant脚本中。
在包含XML文件的xsl-stylesheet指令中。这适用于人们希望在Web浏览器中立即查看他们在任何XML文件中所做的更改的情况。到目前为止,这已被证明是一个非常有效的环境,所以我不想放松它。
我能够通过Python脚本中的ElementTree.xinclude()方法获得用例1。但是,这不是用例2的解决方案。
另外,我确实理解如何编写仅执行Xinclude分辨率的XSLT样式表,理论上这可以用作第一个转换,然后是用于XML到HTML转换的现有XSLT样式表。问题是XML文件只能有一个xsl-stylesheet指令。
另一个想法是将XInclude解析保留在Web浏览器中。但是,我不知道任何支持它的Web浏览器。此外,我不想限制只使用一个特定的浏览器。到目前为止,我们支持所有最常见的浏览器。
另一个想法是将XInclude解析支持添加到现有的XSLT样式表中。但是,我正在努力解决输入和输出的问题,因为这些实际上是三个阶段(文件中的XML输入 - >带有Xinclude解析的FLat XML - > HTML。XInclude解析部分需要执行第一次转换和现有的XSLT代码将执行第二次。我不确定在一个样式表中是否可行。
我的问题是:
使用Web浏览器打开(包括)XML文件时,有什么方法可以调用两个XSLT样式表吗?
有什么方法可以改进现有的XSLT样式表并使用XInclude支持,以便它仍然是一个样式表吗?
XSLT样式表中是否有任何方法可以修改输入?
Web浏览器是否在XInclude解析中提供任何支持?
由于 安迪
答案 0 :(得分:2)
1有什么方法可以在调用时调用两个XSLT样式表 用Web浏览器打开(包括)XML文件?
2有什么办法可以改进现有的XSLT样式表 X包括支持,以便它仍然是一个样式表?
[3] XSLT样式表中是否有任何方法可以修改输入?
[4] Web浏览器是否在XInclude解析中提供任何支持?
以相反的顺序处理问题,因为这样更容易:
(4)我还没有看到任何进行XInclude扩展的Web浏览器。
(3)我不知道你的意思是“修改输入”:XSLT转换 (或修改)输入到输出。除非你问:可以 您在一步中修改输入,然后再次转换输出 又一次?是的:如果浏览器支持exslt:node-set,那么你可以 使用一个转换的结果创建一个变量,然后选择 另一个变换的变量。您可以使用模式进行选择 不同步骤的不同模板集。
类似的东西:
<xsl:variable name="doc.all">
<xsl:apply-templates mode="p1" select="/" />
</xsl:variable>
带有一系列mode =“p1”模板,以及某个地方 选择该变量作为节点集的模板:
<xsl:template match="/" >
<xsl:apply-templates select="exslt:node-set($doc.all)" />
</xsl:template>
[XSLT-2.0可以更直接地处理节点集,但是没有浏览器 原生支持XSLT-2.0]
(2)我不知道您现有的样式表是什么样的,但可能是:YES。 当你想到它必然是两个独立的时候,你在程序上思考 执行XInclude处理和xslt其余部分的步骤。如果你在做 XInclude使用XSLT进行扩展,然后xinclude只是另一组要匹配的模式。
您可能需要类似此模板的内容来执行xinclude扩展:
<xsl:template match="xi:include[@href][@parse='xml' or not(@parse)]">
<xsl:apply-templates select="document(@href)/*" />
</xsl:template>
modified from the answer to this question:在文档后添加“/ *”(@href) 避免在包含的文档和基础上再次调用根模板 文献。
然后包含一个match =“/”模板来设置外部html,其余部分 转换模式来创建内部节点。
这里隐含两个步骤:第一步是将输入源重定向到 xi:include / @ href遇到该元素时。步骤是处理节点 在该文档中根据其他匹配模板。
(1)您只能使用PI运行一个样式表,但是,您有 浏览器中的Javascript,只要您避免跨域安全问题,就应该 能够在程序上做事。
需要考虑的一些要点:
如果作为一个转换的结果,您生成另一个具有不同指令的文件,我不知道浏览器会做什么。它会继续吗?可能值得一试。如果没有,您可以在javascript中明确地进行处理,然后应用第二个转换。
您在浏览器中拥有xslt,javascript和css支持:您可以将javascript和css注入输出。而css可以设置XML和HTML的样式。
Michael Kay发布了Saxon CE,这是一个编译成javascript的XSLT 2.0实现,因此它可以在浏览器中运行。
答案 1 :(得分:0)
你应该看看XProc来做那件事
看来你的用例太麻烦了,不能在单个XSLT中完成