如何根据XSLT 2.0中的子属性值计算第一个<w:p>元素的索引位置?</w:p>

时间:2012-01-03 05:08:12

标签: xml xslt xpath xslt-2.0

这是我的XML文档。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">

<w:body>

    <w:p> <!-- index 0 -->
        <w:pPr>
            <w:pStyle w:val="Heading1"/>
        </w:pPr>

        <w:r>
            <w:t>
                 Paragraph1
            </w:t>
        </w:r>
    </w:p>

    <w:p> <!-- index 1 -->
        <w:pPr>
            <w:pStyle w:val="TOC1"/>
        </w:pPr>

        <w:r>
            <w:t>
                 TOC1
            </w:t>
        </w:r>
    </w:p>

    <w:p>  <!-- index 2 -->
        <w:pPr>
            <w:pStyle w:val="TOC2"/>
        </w:pPr>

        <w:r>
            <w:t>
                 TOC2
            </w:t>
        </w:r>
    </w:p>
    <w:p> <!-- index 3 -->
        <w:pPr>
            <w:pStyle w:val="TOC3"/>
        </w:pPr>

        <w:r>
            <w:t>
                 TOC3
            </w:t>
        </w:r>
    </w:p>
    <w:p> <!-- index 4 -->
        <w:pPr>
        </w:pPr>
        <w:r>
            <w:t>
                 Paragraph2
            </w:t>
        </w:r>
    </w:p>

    <w:p> <!-- index 5 -->
        <w:pPr>
            <w:pStyle w:val="Heading1"/>
        </w:pPr>

        <w:r>
            <w:t>
                 Paragraph3
            </w:t>
        </w:r>
    </w:p>

</w:body>
</w:document>   

所以,现在我想计算以下两件事

1.Count以{TOC'开头的<w:pStyle>值的元素的起始索引位置。这是从第一个<w:p>元素开始(假设索引从'0'开始)。所以,我想要以下输出

2.以“TOC”开头的<w:pStyle>值的总数。我已按照以下表达式计算。所以请指导我先获得...

<xsl:attribute name="totalTOC">
   <xsl:value-of select="count(//w:body/w:p[w:pPr[w:pStyle[starts-with(@w:val,'TOC')]]])"/>
<xsl:attribute> 

我的要求输出是:

<Document>
<TOC startIndex="1" totalTOC="3"/>
</Document>

1 个答案:

答案 0 :(得分:2)

您可以使用preceding-sibling轴:

count(//w:body/w:p[w:pPr[w:pStyle[starts-with(@w:val,'TOC')]]][1]/preceding-sibling::*)

这将选择符合条件的第一个元素,并返回其前一个兄弟的计数(当前索引)。对于基于一个索引,只需添加1。