xml结构的字符串长度

时间:2016-04-13 14:06:02

标签: xslt xsd string-length

我有一个大型XSD I进程,使用多个模板来获取新的XSD。 在最后一步中,我想确定在变量xsdresult中捕获的xml(实际上是XSD)的长度。

使用字符串长度函数,我看到一个奇怪的长度与xsdresult的可变长度不匹配。 string / xsd的大小超过52000个字符,但我看到长度:9862我做错了什么?

   <!-- Catch output in variable -->
   <xsl:variable name="xsdresult">
        <xsl:call-template name="start"/>
   </xsl:variable>

   <xsl:template name="start">
      <xsl:apply-templates/>
   </xsl:template>


   <!-- Build required doc parts -->
   <xsl:variable name="docparts">
        <xsl:call-template name="builddocparts"/>
   </xsl:variable>

   <xsl:template name="builddocparts">
        Length: <xsl:value-of select="string-length(normalize-unicode($xsdresult))"/>
    </xsl:template>
...

1 个答案:

答案 0 :(得分:1)

string-length()的调用相当于对string-length(.)的调用,后者又将当前节点强制转换为字符串,因此它等同于string-length(string(.))string()函数的值是节点的字符串值,对于元素节点,它是由所有后代文本节点的串联形成的字符串。

如果您想知道序列化XML文档在磁盘上占用的最小空间量,给定一个简单的序列化,那么您必须添加:

  • 对于每个非空元素,其开始标记的长度:元素类型名称的长度,以及开始标记分隔符< ... >的加2,以及属性值规范的长度之和。
  • 对于每个属性值规范,您将需要一个字符用于前导空格,加上属性名称的长度,加上属性值的字符串长度,加上等号和引号的三个字符,再加上五个字符每次引号都被&apos;&quot;替换。
  • 对于每个非空元素,其结束标记的长度(元素类型名称的长度加上3)。
  • 对于每个空元素,其唯一标记的长度(其元素类型名称的长度,加上其属性值规范的长度,加上3)。
  • 对于数据或属性值中每次出现的<,转义为&lt;的三个字符。
  • 对于数据或属性值中每次出现的&符号,转义为&amp;的四个字符。

不是最低金额的一部分,但可能是磁盘上所需空间的一部分:

  • 如果从结构上缩进XML,则添加的任何空格的总宽度。
  • 您序列化的CDATA标记部分的数量,为12(对于<![CDATA[ + ]]>)。
  • 使用CDATA标记的部分而不是&lt;&amp;保存的字符数。