首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确定XSLT中“使用”的所有xpath引用/ xml元素

确定XSLT中“使用”的所有xpath引用/ xml元素
EN

Stack Overflow用户
提问于 2013-02-08 10:41:50
回答 3查看 189关注 0票数 1

问题:

我们有一个庞大的XML文档。该文档在最终被用于XSLT2转换之前传递了一段时间,这为在PDF呈现引擎中使用它做好了准备。问题是,当我们到达PDF呈现引擎时,XML实际需要的百分比相对于它的原始大小非常小。对于其他进程,我们仍然需要完整的XML,但就面向呈现引擎的“流”而言,理想情况下,我们希望尽快将XML简化到其基本要素,以便传递的数据量更小。

我们不能在这个过程的早期完成最后的XSLT2转换,因为在此之前会发生更多的XML操作。

因此,我们想要做的是创建一个新的样式表,它简单地“保留”原始XML文档的结构,但只保留我们真正感兴趣的用于报告目的的XML元素。我们非常乐意编写必要的XSLT文档,但由于最终的XSLT2文档是一个复杂的庞然大物,我们希望堆栈溢出社区中的某个人有一个简单的方法来完成以下工作:

理想解:

从现有的xPath样式表中提取所有引用的XSLT2元素(即它们的XML元素)的列表的方法。我们希望这包括引用的XML元素,不仅在select/value-ofs/etc中,而且在fors/初始条件/等等中。

我意识到这可能不是一个简单的答案,但万一有人以前这样做过,或者可以给我一个起点,我将非常感谢任何帮助。

提前感谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-08 17:31:35

祝好运。我不知道有什么现成的解决方案。

我可以想到解决这个问题的两种方法;这两种方法都非常有趣,而且(在一般情况下)都有很多工作要做,在这种情况下,只有当细化XML的优点对您来说很有价值,或者如果您的特定情况比一般情况要容易得多时,这两种方法都是值得的。

  1. 您可以对XSLT样式表进行测试,以便每当任何模板访问某个节点时,它都会记录该节点的标识(例如,以简单XPointer的样式从根目录中以数字路径的形式记录该节点,或者可能以完全限定的泛型标识符的形式记录该节点的标识符(从document元素开始的元素名称序列,然后继续到所访问的元素)。然后,第二个样式表可以读取访问的节点列表,并复制输入,标记每个节点是否已被使用。这样做可以获得足够的输入,您将(可能)看到可以用来细化XML的模式。这样做可以获得足够的输入,您可以检查给定的细化过程是否会(a)遗漏了一些可能掉的东西,或者(b)掉了一些不应该掉的东西。
  2. 您可以尝试从样式表抽象地工作,从根元素的模板开始,并注意哪些可能的元素类将匹配哪些模板。如果您有一个很好的输入词汇表模式,并且可以假设对该模式的有效性作为一个前提,这将有助于您在这里进行推理。

这两种方法都非常具有挑战性--第二种方法看上去很像类型理论家试图做的那种事情,以使人们能够预先预测给定XSLT转换的输出对于特定的输出(给定有效的输入)是否有效。不幸的是,到目前为止,对这项工作的简短总结似乎是“天哪,那太难了!”另一方面,您的任务比他们的任务要简单一些:您想知道的是,通过查看转换,您能事先知道XML文档中的特定分支永远不会影响转换的输出吗?你不需要在一般情况下解决它,你只需要解决一个特定的转换。

票数 0
EN

Stack Overflow用户

发布于 2015-05-17 10:41:45

您希望有一个XSLT样式表,它以与以前完全相同的结构复制新文档可用的任何内容,只跳过那些被认为是多余的标记。

下面的样式表正是这样做的。

代码语言:javascript
复制
<?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。

票数 0
EN

Stack Overflow用户

发布于 2016-11-29 08:55:35

后期添加:这里描述的内容听起来非常像“文档投影”,这是一种在许多XQuery处理器(包括Saxon)中可用的技术。XQuery比XSLT更适合静态分析(因为它缺乏非常动态的模板发送机制)。

文档投影以文档和查询作为输入,并生成仅包含原始文档中回答原始查询所需的部分的文档作为输出。好处是文档投影过程是流的-原始文档不需要构建在内存中;相反,投影过程充当来自XML解析器的事件的过滤器。

最初的理论描述如下: Amelie,Jerome,2003,投影XML文档,哥伦比亚大学学术共享,http://hdl.handle.net/10022/AC:P:29177

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14770732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档