我的源文件是:
<?xml version="1.0" encoding="UTF-8"?>
<toc>
<tit>Table des matières</tit>
<lev1 id="lev1-1">
<disp>display contents for «@id='lev1-1'».</disp>
</lev1>
<lev1 id="lev1-2">
<disp>display contents for «@id='lev1-2'».</disp>
<lev3 id="lev3-1">
<disp>display contents for «@id='lev3-1'».</disp>
<lev4 id="lev4-1">
<disp>display contents for «@id='lev4-1'».</disp>
</lev4>
</lev3>
<lev3 id="lev3-2">
<disp>display contents for «@id='lev3-2'».</disp>
</lev3>
<lev3 id="lev3-3">
<disp>display contents for «@id='lev3-3'».</disp>
</lev3>
<lev3 id="lev3-4">
<disp>display contents for «@id='lev3-4'».</disp>
</lev3>
<lev3 id="lev3-5">
<disp>display contents for «@id='lev3-5'».</disp>
</lev3>
</lev1>
<lev1 id="lev1-3">
<disp>display contents for «@id='lev1-3'».</disp>
<lev2 id="lev2-1">
<disp>display contents for «@id='lev2-1'».</disp>
<lev4 id="lev4-2">
<disp>display contents for «@id='lev4-2'».</disp>
</lev4>
<lev4 id="lev4-3">
<disp>display contents for «@id='lev4-3'».</disp>
</lev4>
<lev4 id="lev4-4">
<disp>display contents for «@id='lev4-4'».</disp>
</lev4>
<lev3 id="lev3-6">
<disp>display contents for «@id='lev3-6'».</disp>
<lev4 id="lev4-5">
<disp>display contents for «@id='lev4-5'».</disp>
</lev4>
<lev4 id="lev4-6">
<disp>display contents for «@id='lev4-6'».</disp>
</lev4>
<lev4 id="lev4-7">
<disp>display contents for «@id='lev4-7'».</disp>
</lev4>
<lev4 id="lev4-8">
<disp>display contents for «@id='lev4-8'».</disp>
</lev4>
<lev4 id="lev4-9">
<disp>display contents for «@id='lev4-9'».</disp>
</lev4>
<lev4 id="lev4-10">
<disp>display contents for «@id='lev4-10'».</disp>
</lev4>
</lev3>
<lev3 id="lev3-7">
<disp>display contents for «@id='lev3-7'».</disp>
</lev3>
<lev3 id="lev3-8">
<disp>display contents for «@id='lev3-8'».</disp>
</lev3>
</lev2>
<lev2 id="lev2-2">
<disp>display contents for «@id='lev2-2'».</disp>
<lev3 id="lev3-9">
<disp>display contents for «@id='lev3-9'».</disp>
<lev4 id="lev4-11">
<disp>display contents for «@id='lev4-11'».</disp>
</lev4>
<lev4 id="lev4-12">
<disp>display contents for «@id='lev4-12'».</disp>
</lev4>
</lev3>
<lev3 id="lev3-10">
<disp>display contents for «@id='lev3-10'».</disp>
<lev4 id="lev4-13">
<disp>display contents for «@id='lev4-13'».</disp>
</lev4>
<lev4 id="lev4-14">
<disp>display contents for «@id='lev4-14'».</disp>
</lev4>
<lev4 id="lev4-15">
<disp>display contents for «@id='lev4-15'».</disp>
</lev4>
<lev4 id="lev4-16">
<disp>display contents for «@id='lev4-16'».</disp>
</lev4>
</lev3>
<lev3 id="lev3-11">
<disp>display contents for «@id='lev3-11'».</disp>
<lev4 id="lev4-17">
<disp>display contents for «@id='lev4-17'».</disp>
</lev4>
<lev4 id="lev4-18">
<disp>display contents for «@id='lev4-18'».</disp>
</lev4>
</lev3>
<lev3 id="lev3-12">
<disp>display contents for «@id='lev3-12'».</disp>
<lev4 id="lev4-19">
<disp>display contents for «@id='lev4-19'».</disp>
</lev4>
<lev4 id="lev4-20">
<disp>display contents for «@id='lev4-20'».</disp>
</lev4>
<lev4 id="lev4-21">
<disp>display contents for «@id='lev4-21'».</disp>
</lev4>
</lev3>
<lev3 id="lev3-13">
<disp>display contents for «@id='lev3-13'».</disp>
</lev3>
</lev2>
<lev2 id="lev2-3">
<disp>display contents for «@id='lev2-3'».</disp>
<lev3 id="lev3-14">
<disp>display contents for «@id='lev3-14'».</disp>
<lev4 id="lev4-22">
<disp>display contents for «@id='lev4-22'».</disp>
</lev4>
<lev4 id="lev4-23">
<disp>display contents for «@id='lev4-23'».</disp>
</lev4>
<lev4 id="lev4-24">
<disp>display contents for «@id='lev4-24'».</disp>
</lev4>
</lev3>
<lev3 id="lev3-15">
<disp>display contents for «@id='lev3-15'».</disp>
<lev4 id="lev4-25">
<disp>display contents for «@id='lev4-25'».</disp>
</lev4>
<lev4 id="lev4-26">
<disp>display contents for «@id='lev4-26'».</disp>
</lev4>
<lev4 id="lev4-27">
<disp>display contents for «@id='lev4-27'».</disp>
</lev4>
</lev3>
<lev3 id="lev3-16">
<disp>display contents for «@id='lev3-16'».</disp>
</lev3>
<lev3 id="lev3-17">
<disp>display contents for «@id='lev3-17'».</disp>
</lev3>
</lev2>
<lev2 id="lev2-4">
<disp>display contents for «@id='lev2-4'».</disp>
<lev3 id="lev3-18">
<disp>display contents for «@id='lev3-18'».</disp>
</lev3>
<lev3 id="lev3-19">
<disp>display contents for «@id='lev3-19'».</disp>
<lev4 id="lev4-28">
<disp>display contents for «@id='lev4-28'».</disp>
</lev4>
<lev4 id="lev4-29">
<disp>display contents for «@id='lev4-29'».</disp>
</lev4>
<lev4 id="lev4-30">
<disp>display contents for «@id='lev4-30'».</disp>
</lev4>
<lev4 id="lev4-31">
<disp>display contents for «@id='lev4-31'».</disp>
</lev4>
<lev4 id="lev4-32">
<disp>display contents for «@id='lev4-32'».</disp>
</lev4>
<lev4 id="lev4-33">
<disp>display contents for «@id='lev4-33'».</disp>
</lev4>
</lev3>
<lev3 id="lev3-20">
<disp>display contents for «@id='lev3-20'».</disp>
<lev4 id="lev4-34">
<disp>display contents for «@id='lev4-34'».</disp>
</lev4>
<lev4 id="lev4-35">
<disp>display contents for «@id='lev4-35'».</disp>
</lev4>
</lev3>
<lev3 id="lev3-21">
<disp>display contents for «@id='lev3-21'».</disp>
<lev4 id="lev4-36">
<disp>display contents for «@id='lev4-36'».</disp>
</lev4>
</lev3>
<lev3 id="lev3-22">
<disp>display contents for «@id='lev3-22'».</disp>
</lev3>
<lev3 id="lev3-23">
<disp>display contents for «@id='lev3-23'».</disp>
</lev3>
</lev2>
<lev2 id="lev2-5">
<disp>display contents for «@id='lev2-5'».</disp>
<lev3 id="lev3-24">
<disp>display contents for «@id='lev3-24'».</disp>
<lev4 id="lev4-37">
<disp>display contents for «@id='lev4-37'».</disp>
</lev4>
<lev4 id="lev4-38">
<disp>display contents for «@id='lev4-38'».</disp>
</lev4>
<lev4 id="lev4-39">
<disp>display contents for «@id='lev4-39'».</disp>
</lev4>
<lev4 id="lev4-40">
<disp>display contents for «@id='lev4-40'».</disp>
</lev4>
</lev3>
<lev3 id="lev3-25">
<disp>display contents for «@id='lev3-25'».</disp>
<lev4 id="lev4-41">
<disp>display contents for «@id='lev4-41'».</disp>
</lev4>
<lev4 id="lev4-42">
<disp>display contents for «@id='lev4-42'».</disp>
</lev4>
<lev4 id="lev4-43">
<disp>display contents for «@id='lev4-43'».</disp>
</lev4>
<lev4 id="lev4-44">
<disp>display contents for «@id='lev4-44'».</disp>
</lev4>
<lev4 id="lev4-45">
<disp>display contents for «@id='lev4-45'».</disp>
</lev4>
</lev3>
<lev3 id="lev3-26">
<disp>display contents for «@id='lev3-26'».</disp>
</lev3>
<lev3 id="lev3-27">
<disp>display contents for «@id='lev3-27'».</disp>
</lev3>
</lev2>
</lev1>
<lev1 id="lev1-4">
<disp>display contents for «@id='lev1-4'».</disp>
<lev2 id="lev2-6">
<disp>display contents for «@id='lev2-6'».</disp>
<lev3 id="lev3-28">
<disp>display contents for «@id='lev3-28'».</disp>
<lev4 id="lev4-46">
<disp>display contents for «@id='lev4-46'».</disp>
</lev4>
</lev3>
<lev3 id="lev3-29">
<disp>display contents for «@id='lev3-29'».</disp>
<lev4 id="lev4-47">
<disp>display contents for «@id='lev4-47'».</disp>
</lev4>
<lev4 id="lev4-48">
<disp>display contents for «@id='lev4-48'».</disp>
</lev4>
<lev4 id="lev4-49">
<disp>display contents for «@id='lev4-49'».</disp>
</lev4>
</lev3>
<lev3 id="lev3-30">
<disp>display contents for «@id='lev3-30'».</disp>
<lev4 id="lev4-50">
<disp>display contents for «@id='lev4-50'».</disp>
</lev4>
<lev4 id="lev4-51">
<disp>display contents for «@id='lev4-51'».</disp>
</lev4>
</lev3>
<lev3 id="lev3-31">
<disp>display contents for «@id='lev3-31'».</disp>
<lev4 id="lev4-52">
<disp>display contents for «@id='lev4-52'».</disp>
</lev4>
</lev3>
<lev3 id="lev3-32">
<disp>display contents for «@id='lev3-32'».</disp>
<lev4 id="lev4-53">
<disp>display contents for «@id='lev4-53'».</disp>
</lev4>
<lev4 id="lev4-54">
<disp>display contents for «@id='lev4-54'».</disp>
</lev4>
<lev4 id="lev4-55">
<disp>display contents for «@id='lev4-55'».</disp>
</lev4>
<lev4 id="lev4-56">
<disp>display contents for «@id='lev4-56'».</disp>
</lev4>
</lev3>
<lev3 id="lev3-33">
<disp>display contents for «@id='lev3-33'».</disp>
</lev3>
<lev3 id="lev3-34">
<disp>display contents for «@id='lev3-34'».</disp>
</lev3>
</lev2>
<lev2 id="lev2-7">
<disp>display contents for «@id='lev2-7'».</disp>
<lev3 id="lev3-35">
<disp>display contents for «@id='lev3-35'».</disp>
<lev4 id="lev4-57">
<disp>display contents for «@id='lev4-57'».</disp>
</lev4>
<lev4 id="lev4-58">
<disp>display contents for «@id='lev4-58'».</disp>
</lev4>
<lev4 id="lev4-59">
<disp>display contents for «@id='lev4-59'».</disp>
</lev4>
<lev4 id="lev4-60">
<disp>display contents for «@id='lev4-60'».</disp>
</lev4>
<lev4 id="lev4-61">
<disp>display contents for «@id='lev4-61'».</disp>
</lev4>
<lev4 id="lev4-62">
<disp>display contents for «@id='lev4-62'».</disp>
</lev4>
<lev4 id="lev4-63">
<disp>display contents for «@id='lev4-63'».</disp>
</lev4>
</lev3>
<lev3 id="lev3-36">
<disp>display contents for «@id='lev3-36'».</disp>
<lev4 id="lev4-64">
<disp>display contents for «@id='lev4-64'».</disp>
</lev4>
<lev4 id="lev4-65">
<disp>display contents for «@id='lev4-65'».</disp>
</lev4>
<lev4 id="lev4-66">
<disp>display contents for «@id='lev4-66'».</disp>
</lev4>
<lev4 id="lev4-67">
<disp>display contents for «@id='lev4-67'».</disp>
</lev4>
<lev4 id="lev4-68">
<disp>display contents for «@id='lev4-68'».</disp>
</lev4>
<lev4 id="lev4-69">
<disp>display contents for «@id='lev4-69'».</disp>
</lev4>
<lev4 id="lev4-70">
<disp>display contents for «@id='lev4-70'».</disp>
</lev4>
</lev3>
<lev3 id="lev3-37">
<disp>display contents for «@id='lev3-37'».</disp>
</lev3>
<lev3 id="lev3-38">
<disp>display contents for «@id='lev3-38'».</disp>
</lev3>
</lev2>
<lev2 id="lev2-8">
<disp>display contents for «@id='lev2-8'».</disp>
<lev3 id="lev3-39">
<disp>display contents for «@id='lev3-39'».</disp>
<lev4 id="lev4-71">
<disp>display contents for «@id='lev4-71'».</disp>
</lev4>
<lev4 id="lev4-72">
<disp>display contents for «@id='lev4-72'».</disp>
</lev4>
<lev4 id="lev4-73">
<disp>display contents for «@id='lev4-73'».</disp>
</lev4>
</lev3>
<lev3 id="lev3-40">
<disp>display contents for «@id='lev3-40'».</disp>
<lev4 id="lev4-74">
<disp>display contents for «@id='lev4-74'».</disp>
</lev4>
<lev4 id="lev4-75">
<disp>display contents for «@id='lev4-75'».</disp>
</lev4>
<lev4 id="lev4-76">
<disp>display contents for «@id='lev4-76'».</disp>
</lev4>
</lev3>
<lev3 id="lev3-41">
<disp>display contents for «@id='lev3-41'».</disp>
</lev3>
<lev3 id="lev3-42">
<disp>display contents for «@id='lev3-42'».</disp>
</lev3>
</lev2>
<lev2 id="lev2-9">
<disp>display contents for «@id='lev2-9'».</disp>
<lev3 id="lev3-43">
<disp>display contents for «@id='lev3-43'».</disp>
<lev4 id="lev4-77">
<disp>display contents for «@id='lev4-77'».</disp>
</lev4>
<lev4 id="lev4-78">
<disp>display contents for «@id='lev4-78'».</disp>
</lev4>
</lev3>
<lev3 id="lev3-44">
<disp>display contents for «@id='lev3-44'».</disp>
</lev3>
<lev3 id="lev3-45">
<disp>display contents for «@id='lev3-45'».</disp>
<lev4 id="lev4-79">
<disp>display contents for «@id='lev4-79'».</disp>
</lev4>
<lev4 id="lev4-80">
<disp>display contents for «@id='lev4-80'».</disp>
</lev4>
</lev3>
<lev3 id="lev3-46">
<disp>display contents for «@id='lev3-46'».</disp>
</lev3>
<lev3 id="lev3-47">
<disp>display contents for «@id='lev3-47'».</disp>
<lev4 id="lev4-81">
<disp>display contents for «@id='lev4-81'».</disp>
</lev4>
<lev4 id="lev4-82">
<disp>display contents for «@id='lev4-82'».</disp>
</lev4>
<lev4 id="lev4-83">
<disp>display contents for «@id='lev4-83'».</disp>
</lev4>
</lev3>
<lev3 id="lev3-48">
<disp>display contents for «@id='lev3-48'».</disp>
</lev3>
<lev3 id="lev3-49">
<disp>display contents for «@id='lev3-49'».</disp>
</lev3>
</lev2>
<lev2 id="lev2-10">
<disp>display contents for «@id='lev2-10'».</disp>
<lev3 id="lev3-50">
<disp>display contents for «@id='lev3-50'».</disp>
<lev4 id="lev4-84">
<disp>display contents for «@id='lev4-84'».</disp>
</lev4>
<lev4 id="lev4-85">
<disp>display contents for «@id='lev4-85'».</disp>
</lev4>
<lev4 id="lev4-86">
<disp>display contents for «@id='lev4-86'».</disp>
</lev4>
</lev3>
<lev3 id="lev3-51">
<disp>display contents for «@id='lev3-51'».</disp>
<lev4 id="lev4-87">
<disp>display contents for «@id='lev4-87'».</disp>
</lev4>
<lev4 id="lev4-88">
<disp>display contents for «@id='lev4-88'».</disp>
</lev4>
<lev4 id="lev4-89">
<disp>display contents for «@id='lev4-89'».</disp>
</lev4>
</lev3>
<lev3 id="lev3-52">
<disp>display contents for «@id='lev3-52'».</disp>
<lev4 id="lev4-90">
<disp>display contents for «@id='lev4-90'».</disp>
</lev4>
<lev4 id="lev4-91">
<disp>display contents for «@id='lev4-91'».</disp>
</lev4>
</lev3>
<lev3 id="lev3-53">
<disp>display contents for «@id='lev3-53'».</disp>
<lev4 id="lev4-92">
<disp>display contents for «@id='lev4-92'».</disp>
</lev4>
<lev4 id="lev4-93">
<disp>display contents for «@id='lev4-93'».</disp>
</lev4>
<lev4 id="lev4-94">
<disp>display contents for «@id='lev4-94'».</disp>
</lev4>
</lev3>
<lev3 id="lev3-54">
<disp>display contents for «@id='lev3-54'».</disp>
</lev3>
<lev3 id="lev3-55">
<disp>display contents for «@id='lev3-55'».</disp>
</lev3>
</lev2>
</lev1>
<lev1 id="lev1-5">
<disp>display contents for «@id='lev1-5'».</disp>
<lev3 id="lev3-56">
<disp>display contents for «@id='lev3-56'».</disp>
</lev3>
<lev3 id="lev3-57">
<disp>display contents for «@id='lev3-57'».</disp>
</lev3>
<lev3 id="lev3-58">
<disp>display contents for «@id='lev3-58'».</disp>
</lev3>
</lev1>
</toc>
这是 XSL 文档:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- for testing resons, nested structures removed -->
<xsl:template match="/">
<levs>
<xsl:apply-templates select="//lev1|//lev2|//lev3|//lev4|//lev5"/>
</levs>
</xsl:template>
<xsl:template match="//lev1|//lev2|//lev3|//lev4|//lev5">
<xsl:variable name="depth" select="replace(local-name(),'lev','','i')"/>
<xsl:variable name="position" select="count(preceding::*[matches(local-name(),'^lev\d+')]) + 1"/>
<lev id="{@id}" position="{$position}" depth="{$depth}" name="{local-name()}"/>
</xsl:template>
<!-- final output would be like following -->
<!--
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:param name="extref">file:/c:/somefolder/somefile.xml</xsl:param>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<toc>
<xsl:apply-templates select="toc"/>
</toc>
</xsl:template>
<xsl:template match="//lev1|//lev2|//lev3|//lev4|//lev5">
<xsl:variable name="depth" select="replace(local-name(.),'lev','','i')"/>
<xsl:variable name="position" select="count(preceding::*[matches(local-name(),'^lev\d+')]) + 1"/>
<lev id="{@id}" position="{$position}" depth="{$depth}">
<disp><xsl:apply-templates/></disp>
<refdoc href="{concat($extref,'#',@id)}"/>
</lev>
</xsl:template>
-->
</xsl:transform>
和输出:
<?xml version="1.0" encoding="UTF-8"?>
<levs>
<lev id="lev1-1" position="1" depth="1" name="lev1"/>
<lev id="lev1-2" position="2" depth="1" name="lev1"/>
<lev id="lev3-1" position="2" depth="3" name="lev3"/>
<lev id="lev4-1" position="2" depth="4" name="lev4"/>
<lev id="lev3-2" position="4" depth="3" name="lev3"/>
<!--items removed for clarity-->
<lev id="lev3-58" position="166" depth="3" name="lev3"/>
</levs>
我的问题是计算 XPath 构造count(preceding::*[matches(local-name(),'^lev\d+')]) + 1
会产生错误的结果。的产生的值@position
不是线性的,因为值之间的共同差异应该是1
,而生成的序列是0
,1
或>1
。
我可以简单地通过使用«for-each»
循环来解决这个问题,但我也必须保留嵌套结构。
有人帮我解决我的问题吗?我错过了什么吗?