Как считать всеузлы (внутри) моего текущего узла, использующего XSLT 2.0? - PullRequest
1 голос
/ 26 сентября 2011

Это мой 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>.Итак, для этого сценария мой ожидаемый счет составляет 7 в это время ...

как мне это сделать? Помогите мне получить это ...

1 Ответ

2 голосов
/ 26 сентября 2011

Используйте

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

Примечание. 1025 *: поскольку оси preceding:: и ancestor:: не перекрываются, это более общее решение, которое не зависит от структуры документа и учитывает возможность того, что некоторые из желаемое количество узлов может быть предками:

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