计算xml-tree的最大深度

时间:2012-08-24 13:32:37

标签: xml xslt xpath

用于计算xml缩进深度的最简单的xpath 2.0是什么?我的变体还不聪明:

<xsl:param name="maxdepth" select="number(substring(concat(
'16'[count(current()/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*)>0],
'15'[count(current()/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*)>0],
'14'[count(current()/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*)>0],
'13'[count(current()/*/*/*/*/*/*/*/*/*/*/*/*/*/*)>0],
'12'[count(current()/*/*/*/*/*/*/*/*/*/*/*/*/*)>0],
'11'[count(current()/*/*/*/*/*/*/*/*/*/*/*/*)>0],
'10'[count(current()/*/*/*/*/*/*/*/*/*/*)>0],
'09'[count(current()/*/*/*/*/*/*/*/*/*)>0],
'08'[count(current()/*/*/*/*/*/*/*/*)>0],
'07'[count(current()/*/*/*/*/*/*/*)>0],
'06'[count(current()/*/*/*/*/*/*)>0],
'05'[count(current()/*/*/*/*/*)>0],
'04'[count(current()/*/*/*/*)>0],
'03'[count(current()/*/*/*)>0],
'02'[count(current()/*/*)>0],
'01'[count(current()/*)>0])
,1,2)
)"/>

1 个答案:

答案 0 :(得分:5)

使用

max(//node()[not(node())]/count(ancestor-or-self::node()))

这将生成XML文档中叶节点所有深度的最大深度,包括级别1的文档节点(/)。

以下是完整示例

<xsl:stylesheet version="2.0"   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>

 <xsl:template match="/">
     <xsl:sequence select=
      "max(//node()[not(node())]/count(ancestor-or-self::node()))"/>
 </xsl:template>
</xsl:stylesheet>

对以下XML文档应用此转换时:

<root>
   <x>This is:</x>
   <a>
      <b>
         <c>hello</c>
      </b>
   </a>
   <a>
      <b>
         <c1>world</c1>
      </b>
   </a>
   <a>
      <b>!</b>
   </a>
   <y>The End</y>
</root>

产生了想要的正确结果

6

<强>更新

如果需要任何元素的最大深度,请使用几乎相同的XPath表达式:

max(//*[not(*)]/count(ancestor-or-self::*))