下午好!
问题:如何在Saxon中使用XSL-T或XPath获取XML树的长度?
目标:我想将XML转换为" large" CSV和"小" CSV基于第二级元素的大小(/ root / secondLevelElement)。大小以字符数表示。 另外编辑:我的全部努力是关于XML的SQLL(提取转换加载)到具有巨大连续并行加载的SQL数据库,其方式如下:Application Server - >提取到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的EXACT长度。
问题:我使用XSL-T 3.0函数找到了以下解决方案" string-length(serialize(。))"
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="3.0">
<xsl:output
method="text"/>
<xsl:template
match="/root/secondLevelElement">
<xsl:value-of
select="string-length(serialize(.))"/>
</xsl:template>
</xsl:stylesheet>
但对于大型XML来说,它看起来很慢。是否有更快的解决方案,如Saxon PE或EE中的Saxon扩展?
提前感谢您的提示。斯泰潘
答案 0 :(得分:1)
如果是&#34; XML树的长度&#34; (一个奇怪的概念:树有高度和宽度,但不是长度)你实际上是指序列化输出中的字符数,那么非常接近的近似就像
sum(.//*/(string-length(name())*2 + 5))
+ sum(.//@*/(string-length(name()) + string-length(.) + 4))
+ sum(.//text()/string-length())
计算应该比实际序列化快一点。
它不允许空元素标签,命名空间声明,注释或处理说明,但不清楚您需要多准确。
答案 1 :(得分:0)
因为2014-10-02发布的Saxon HE 9.6.nn for Java支持XPath 3.0,XPath 3.0包含函数 serialize()和函数 string-length(),所以最后的字符串长度(序列化(myElement))是我现在的选择。