Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt XSL-T:如何获取XML树的长度(以字符而不是“1”表示);字符串长度(序列化(.))“;?_Xslt_Xpath_Saxon - Fatal编程技术网

Xslt XSL-T:如何获取XML树的长度(以字符而不是“1”表示);字符串长度(序列化(.))“;?

Xslt XSL-T:如何获取XML树的长度(以字符而不是“1”表示);字符串长度(序列化(.))“;?,xslt,xpath,saxon,Xslt,Xpath,Saxon,下午好 问题:如何在Saxon中使用XSL-T或XPath获取XML树的字符长度 目标:我想根据第二级元素(/root/secondLevelElement)的大小将XML转换为“大”CSV和“小”CSV。大小以字符数表示。另外编辑:我的全部工作是关于XML到SQL数据库的ETL(extract transform load,提取转换负载),通过以下方式实现巨大的连续并行负载:应用服务器->提取到XML文件->使用XSL-T将XML文件转换为CSV文件->导入数据库。在一个XML文件中,将根据脚

下午好

问题:如何在Saxon中使用XSL-T或XPath获取XML树的字符长度


目标:我想根据第二级元素(/root/secondLevelElement)的大小将XML转换为“大”CSV和“小”CSV。大小以字符数表示。另外编辑:我的全部工作是关于XML到SQL数据库的ETL(extract transform load,提取转换负载),通过以下方式实现巨大的连续并行负载:应用服务器->提取到XML文件->使用XSL-T将XML文件转换为CSV文件->导入数据库。在一个XML文件中,将根据脚本的配置从20.000到50.000个secondLevelElements。每个secondLevelElement的深度可以是5到15+个元素级别。CSV的最后一列是完整的secondLevelElement XML,可以作为VARCHAR2(4.000)或CLOB导入,而前面的列是XPath从secondLevelElement提取的一些元数据。由于导入数据库期间的字符长度至关重要,所以我需要知道每个完整的secondLevelElement XML的确切长度

问题:我使用XSL-T3.0函数“字符串长度(序列化(.)”找到了以下解决方案


但对于大型XML来说,它看起来相当慢。在Saxon PE或EE中有没有像某些Saxon扩展这样更快的解决方案

提前感谢您的提示。Stepan

如果“XML树的长度”(一个奇怪的概念:树有高度和宽度,但没有长度)实际上指的是序列化输出中的字符数,那么非常接近的近似值如下

sum(.//*/(string-length(name())*2 + 5))
+ sum(.//@*/(string-length(name()) + string-length(.) + 4))
+ sum(.//text()/string-length())
计算应该比实际序列化快一点


它不允许空元素标记、名称空间声明、注释或处理指令,但不清楚您需要有多精确。

因为2014-10-02发布的Saxon HE 9.6.n.n for Java支持XPath 3.0,XPath 3.0包含函数序列化()和函数字符串长度(),所以最后的字符串长度(serialize(myElement))现在是我的选择

你真的做了一些性能测试吗?考虑以下内容:如果使用XSLT来删除第二级元素来存储它们,那么在最坏的情况下,只会使运行时间增加一倍。这里的假设是,读取文档和构建树将完全超过执行
序列化
。如果您使用多个输出文档(一组大小和一组子树),它可能只比剪切稍微慢一点。您是否在CSV输出中包含所有的开始和结束标记?也,您没有指出“大XML”是指在几个
secondLevelElement
下的许多级别的元素,还是在每个或许多大
secondLevelElement
下都有浅层结构的许多
secondLevelElement
下的许多
secondLevelElement>下的许多级别的元素。CSV的最后一列将是完整的secondLevelElement XML,可以作为导入VARCHAR2(4.000)或CLOB,而前面的列将是XPath从secondLevelElement提取的一些元数据。由于导入数据库期间的字符长度至关重要,所以我需要知道每个完整的secondLevelElement XML的确切长度。无论如何,在晚上,看起来我将继续使用serialize,因为我将绕过当前方法的另一个瓶颈,如复制和禁用-output-escaping。CSV的最后一列将是完整的secondLevelElement XML,可以作为VARCHAR2(4.000)或CLOB导入,而前面的列将是XPath从secondLevelElement提取的一些元数据。由于导入数据库期间的字符长度至关重要,所以我需要知道每个完整的secondLevelElement XML的确切长度。无论如何,在晚上,看起来我将继续使用serialize,因为我将绕过当前方法的另一个瓶颈,如复制并禁用输出转义。
sum(.//*/(string-length(name())*2 + 5))
+ sum(.//@*/(string-length(name()) + string-length(.) + 4))
+ sum(.//text()/string-length())