XSL-T:如何以“string-length(serialize(。))”之外的字符获取XML树的长度?

时间:2014-10-16 14:04:29

标签: xslt xpath saxon

下午好!

问题:如何在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扩展?

提前感谢您的提示。斯泰潘

2 个答案:

答案 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))是我现在的选择。