如何使用XSLT 2.0计算当前节点的所有<w:p>节点(在<w:body>内)?</w:body> </w:p>

时间:2011-09-26 10:29:13

标签: xml xslt xslt-2.0

这是我的Xml文件

<w:body> <w:p><w:r><w:t>para1</w:t></w:r></w:p>
 <w:p><w:r><w:t>para2</w:t></w:r></w:p>
 <w:p><w:r><w:t>para3</w:t></w:r></w:p>
 <w:p><w:r><w:t>para4</w:t></w:r></w:p>
 <w:p><w:r><w:t>para5</w:t></w:r></w:p>
 <w:tbl><w:tr><w:tc><w:p><w:r><w:t>para6</w:t></w:r></w:p></w:tc>

 <w:tc><w:p><w:r><w:t>para7</w:t></w:r></w:p></w:tc>   <!-- Assume This
 is my Current Node -->

 <w:tc><w:p><w:r><w:t>para8</w:t></w:r></w:p></w:tc>
              </w:tr> </w:tbl> </w:body>

所以,现在我想得到<w:p><w:body>内的所有<w:p><w:tbl>内当前节点的前{{1}}的计数。所以,对于这种情况,我此时的预期数量是7 ......

我是怎么做到的?帮我搞定......

1 个答案:

答案 0 :(得分:2)

使用

count($vtheNode/preceding::w:p)

其中$vtheNode是您的节点。

XSLT(1.0和2.0)解决方案

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:w="w:w">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:variable name="vtheNode" select=
    "/w:body/w:tbl/w:tr/w:tc[last()]"/>

 <xsl:template match="/">
     <xsl:value-of select="count($vtheNode/preceding::w:p)"/>
 </xsl:template>
</xsl:stylesheet>

将此转换应用于提供的XML文档(定义了命名空间以使其格式正确):

<w:body xmlns:w="w:w">
    <w:p>
        <w:r>
            <w:t>para1</w:t>
        </w:r>
    </w:p>
    <w:p>
        <w:r>
            <w:t>para2</w:t>
        </w:r>
    </w:p>
    <w:p>
        <w:r>
            <w:t>para3</w:t>
        </w:r>
    </w:p>
    <w:p>
        <w:r>
            <w:t>para4</w:t>
        </w:r>
    </w:p>
    <w:p>
        <w:r>
            <w:t>para5</w:t>
        </w:r>
    </w:p>

    <w:tbl>
        <w:tr>
            <w:tc>
                <w:p>
                    <w:r>
                        <w:t>para6</w:t>
                    </w:r>
                </w:p>
            </w:tc>
            <w:tc>
                <w:p>
                    <w:r>
                        <w:t>para7</w:t>
                    </w:r>
                </w:p>
            </w:tc>
            <!-- Assume This  is my Current Node -->
            <w:tc>
                <w:p>
                    <w:r>
                        <w:t>para8</w:t>
                    </w:r>
                </w:p>
            </w:tc>
        </w:tr>
    </w:tbl>
</w:body>

产生了想要的正确结果

7

请注意:由于preceding::ancestor::轴不重叠,因此更通用的解决方案不依赖于文档的结构并考虑在内一些想要计算节点可能是祖先的可能性是:

count($vtheNode/preceding::w:p | ($vtheNode/ancestor::w:p)