问题:
我们有一个庞大的XML文档。该文档在最终被用于XSLT2转换之前传递了一段时间,这为在PDF呈现引擎中使用它做好了准备。问题是,当我们到达PDF呈现引擎时,XML实际需要的百分比相对于它的原始大小非常小。对于其他进程,我们仍然需要完整的XML,但就面向呈现引擎的“流”而言,理想情况下,我们希望尽快将XML简化到其基本要素,以便传递的数据量更小。
我们不能在这个过程的早期完成最后的XSLT2转换,因为在此之前会发生更多的XML操作。
因此,我们想要做的是创建一个新的样式表,它简单地“保留”原始XML文档的结构,但只保留我们真正感兴趣的用于报告目的的XML元素。我们非常乐意编写必要的XSLT文档,但由于最终的XSLT2文档是一个复杂的庞然大物,我们希望堆栈溢出社区中的某个人有一个简单的方法来完成以下工作:
理想解:
从现有的xPath样式表中提取所有引用的XSLT2元素(即它们的XML元素)的列表的方法。我们希望这包括引用的XML元素,不仅在select/value-ofs/etc中,而且在fors/初始条件/等等中。
我意识到这可能不是一个简单的答案,但万一有人以前这样做过,或者可以给我一个起点,我将非常感谢任何帮助。
提前感谢!
发布于 2013-02-08 17:31:35
祝好运。我不知道有什么现成的解决方案。
我可以想到解决这个问题的两种方法;这两种方法都非常有趣,而且(在一般情况下)都有很多工作要做,在这种情况下,只有当细化XML的优点对您来说很有价值,或者如果您的特定情况比一般情况要容易得多时,这两种方法都是值得的。
这两种方法都非常具有挑战性--第二种方法看上去很像类型理论家试图做的那种事情,以使人们能够预先预测给定XSLT转换的输出对于特定的输出(给定有效的输入)是否有效。不幸的是,到目前为止,对这项工作的简短总结似乎是“天哪,那太难了!”另一方面,您的任务比他们的任务要简单一些:您想知道的是,通过查看转换,您能事先知道XML文档中的特定分支永远不会影响转换的输出吗?你不需要在一般情况下解决它,你只需要解决一个特定的转换。
发布于 2015-05-17 10:41:45
您希望有一个XSLT样式表,它以与以前完全相同的结构复制新文档可用的任何内容,只跳过那些被认为是多余的标记。
下面的样式表正是这样做的。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:template match="/">
<html><textarea rows="20" cols="120">
<xsl:apply-templates />
</textarea></html>
</xsl:template>
<xsl:template match="*|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="removeElmt1|removeElmt2|@removeAttr1|@removeAttr2">
<!-- do nothing :) -->
</xsl:template>
</xsl:stylesheet>说明:永远不要忘记XSLT不是编程语言,而是转换引擎的规范。
第一个模板指定启动流程,第二个模板指定匹配所有内容,然后复制所有内容,但第三个模板中指定的元素和属性除外。
注意:如果在文档中重用元素或属性,则在第三个模板的“匹配”规范中需要更具体的Xpath语句,以便只删除指定的元素或属性。
第一个模板包含两个冗余规范,以便在浏览器中读取结果。对于确切的副本,您需要删除<html>和<textarea>规范元素,并将输出方法设置为XML。
发布于 2016-11-29 08:55:35
后期添加:这里描述的内容听起来非常像“文档投影”,这是一种在许多XQuery处理器(包括Saxon)中可用的技术。XQuery比XSLT更适合静态分析(因为它缺乏非常动态的模板发送机制)。
文档投影以文档和查询作为输入,并生成仅包含原始文档中回答原始查询所需的部分的文档作为输出。好处是文档投影过程是流的-原始文档不需要构建在内存中;相反,投影过程充当来自XML解析器的事件的过滤器。
最初的理论描述如下: Amelie,Jerome,2003,投影XML文档,哥伦比亚大学学术共享,http://hdl.handle.net/10022/AC:P:29177。
https://stackoverflow.com/questions/14770732
复制相似问题