结果在XPath构造上返回错误的计算值

时间:2012-04-20 08:28:52

标签: xslt xpath

我的源文件是:

<?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,而生成的序列为01>1

我只能通过使用«for-each»循环来解决这个问题,但我也必须保留嵌套结构。

有人帮我解决问题吗?我错过了什么吗?

1 个答案:

答案 0 :(得分:2)

我想你只想要

<xsl:variable name="position" as="xs:integer">
  <xsl:number level="any" count="*[starts-with(local-name(), 'lev')]"/>
</xsl:variable>

那样你应该得到一系列数字1,2,3,4,5 ...... ....