sum of parent child and parent nodes

2019-03-06 11:44发布

问题:

i want a small change in my xslt which is as below.

 <xsl:variable name="sectnum">
    <xsl:number level="any" count="section[(@num and @level ='sect2') or (@level !='sect2' and @level !='sect1') or @level='sect2' or contains(//content-style,'Part')]"/>
        </xsl:variable>

here actually i have path for para as section/para and in para i have para/content-style. i want to count the para with string containing 'Part' in it. please let me know how do i do it. the above variable is giving count only for the @level attributes but not for the para part.

a part of my xml is as below.

  <?xml version="1.0" encoding="UTF-8"?>
<chapter>
<section level="sect2" number-type="manual" num="1.">
            <title>INTRODUCTION</title>
            <para>
                <phrase>1.001</phrase> This part will consider matters relevant to the administration of a deceased's estate from the death to the application for the grant. Chapter 1 will outline some preliminary steps to be taken immediately on obtaining instructions to act. The distinction between testate and intestate succession, and the practical implications of each, will be considered in Chapter 2. Foreign elements, particularly the relevant questions of domicile, the involvement of PRC law, and overseas property, will be noted in Chapter 3. The steps necessary to obtain estate duty clearance (where now necessary) will be briefly considered in Chapter 4. </para>
                </section>
                <section level="sect2">
                    <para>
                    <content-style font-style="bold">Part 1 The deceased person</content-style>
                </para>
                </section>
                </chapter>

second Scenario

    <chapter><section level="sect2">
    <para>
                        <content-style font-style="bold">Part 5 The dependants</content-style>
                    </para></section>
<section level="sect2">
                    <para>Complete the table at Appendix B. </para>
                    <para>
                        <content-style font-style="bold">Part 6 The estate</content-style>
                    </para></section>
    </chapter>

Thanks

回答1:

Looking at your current variable, unless you have a typo, it can actually be simplified to the following

<xsl:number level="any" count="section[@level !='sect1' or contains(//content-style,'Part')]"/>

However, what I think one of the problems you have with the contains. Because you xpath expression starts with //, this means it is relative to the top-level document element, and not the current node, and so will only check the first content-style element it finds.

Also, if you only wanted to count section elements with a para element where the content-style contains "Part", then you have to extend it like so

"... or contains(.//content-style,'Part')] or para[not(.//content-style)]"

Note the full-stop at the start of the contains to indicate it is relative to the current node.

Try either of these instead

<xsl:number level="any" 
     count="section[
        (@num and @level ='sect2') 
        or (@level !='sect2' and @level !='sect1') 
        or @level='sect2' 
        or para[not(.//content-style)] 
        or contains(.//content-style,'Part')]"/>

Or

<xsl:number level="any" 
     count="section[
         @level !='sect1' 
         or para[not(.//content-style)]  
         or contains(.//content-style,'Part')]"/>

Note the full-stop at the start of the contains to indicate it is relative to the current node.



标签: xslt