Xml 如何计算所有<;w:p>;使用xslt 2.0基于我的特定标准的节点?

Xml 如何计算所有<;w:p>;使用xslt 2.0基于我的特定标准的节点?,xml,xslt,xpath,Xml,Xslt,Xpath,这是我的XML文件 <w:document xmlns:w="w"> <w:body> <w:p> <w:r> <w:pict> <v:shape xmlns:v="v"> <v:textbox&

这是我的XML文件

<w:document xmlns:w="w">

    <w:body>                    
        <w:p>
          <w:r>
             <w:pict>
                 <v:shape xmlns:v="v">                   
                     <v:textbox>   
                 <w:txbxContent>    
                     <w:p>             <!-- My Ignore case -->
                <w:r>
                       <w:t>paragraph1
                                </w:t>
                               </w:r>
                            </w:p>  
               </w:txbxContent>
                        </v:textbox>
                      </v:shape>
                   </w:pict>
                </w:r>   
                <w:r>
                  <w:t>Normal Paragraph1</w:t>
                </w:r>

              </w:p>

             <w:p>
                <w:r>
                   <w:t>paragraph2
                   </w:t>
                </w:r>
             </w:p>  
             <w:p>
                <w:r>
                   <w:t>paragraph3
                   </w:t>
                </w:r>
             </w:p>  

             <w:p>
                <w:r>
                   <w:t>paragraph4
                   </w:t>
                </w:r>
             </w:p>  
             <w:p>
                <w:r>
                   <w:t>paragraph5
                   </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><!-- Assume This is my Current Node -->
                </w:tc>   
                <w:tc>
                     <w:p><w:r><w:t>para8</w:t></w:r></w:p>
                </w:tc>
              </w:tr>
            </w:tbl>        
   </w:body>

</w:document>

第1段
正常段落1
第2段
第3段
第4段
第5段
para6
帕拉7
帕拉8
逻辑:1

因此,现在我只想计算
标记中所有前面的
节点。例如,现在我们有来自
的5个节点

逻辑:2

然后如果(
内部
),则计算
内部的所有
,直到当前节点到达

因此,预期的最终结果是:7

我已经写了这个问题的答案,但计算错误

<xsl:value-of select="count($currentNode/preceding::w:p)"/>

它写为8,因为它也将在
中计数(请参阅我的代码上的忽略大小写)。我不想要它


我需要总计数,如logic1+logic2

听起来您想忽略嵌套在其他w:p元素中的w:p元素

如果是这样的话,那么您需要修改for语句,使其只包含没有w:p元素作为祖先的w:p元素

<xsl:value-of select="count($currentNode/preceding::w:p[not(ancestor::w:p)])"/>

:非常感谢。请让我试试。。。“我很快就来了”蒂姆:干得好,蒂姆。。。非常感谢…它工作得非常好…感谢您的时间…@@Tim::您能参考一些有关XSLT编程的好书吗?。我对学习XSLT非常感兴趣。请参考任何有关XSLT的书me@Saravanan:请参阅关于优秀XSLT书籍/资源的回复:@Tim C:此表达式等效于:
count($currentNode/前置::w:p)
因为
前面的::
祖先::
轴是不重叠的!请修改并更正您的答案。另外,如果您还提供了用于评估此XPath表达式的XML文档,那就太好了——这个问题没有提供格式良好的XML文档,两个人可能会构造两个d基于此的不同格式良好的XML文档。您没有说哪个节点是当前节点进行计数???@DimitreNovatchev::我在上面的代码中提到过。请参阅第7段tag@_Saravanan:您给我们的文本甚至不是格式良好的XML文档:未定义的名称空间+未关闭的标记--请更正,否则您的问题就不是定义好了。@_Saravanan:您可能有兴趣知道,有一个更简单且不误导的XPath表达式可以计算所需的计数。@_Saravanan:为什么您继续提供误导性信息?包含“para8”的是
w:p
,而不是包含“para7”的根据您最后的评论。请注意提高您问题的准确性——这一个问题仍然完全令人困惑。除此之外,您的XML仍然是非良好格式的——因为没有定义名称空间。
<w:document xmlns:w="w">
   <w:body>
      <w:p>
         <w:r>
            <w:pict>
               <v:shape xmlns:v="v">
                  <v:textbox>
                     <w:txbxContent>
                        <w:p><!-- My Ignore case -->
                           <w:r>
                              <w:t>paragraph1 </w:t>
                           </w:r>
                        </w:p>
                     </w:txbxContent>
                  </v:textbox>
               </v:shape>
            </w:pict>
         </w:r>
         <w:r>
            <w:t>Normal Paragraph1</w:t>
         </w:r>
      </w:p>
      <w:p>
         <w:r>
            <w:t>paragraph2 </w:t>
         </w:r>
      </w:p>
      <w:p>
         <w:r>
            <w:t>paragraph3 </w:t>
         </w:r>
      </w:p>
      <w:p>
         <w:r>
            <w:t>paragraph4 </w:t>
         </w:r>
      </w:p>
      <w:p>
         <w:r>
            <w:t>paragraph5 </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:document>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:w="w">
   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="/">
      <xsl:variable name="currentNode" select="//w:p[w:r/w:t = 'para8']" />
      Old: <xsl:value-of select="count($currentNode/preceding::w:p)"/> 
      -----
      New: <xsl:value-of select="count($currentNode/preceding::w:p[not(ancestor::w:p)])"/> 
   </xsl:template>

</xsl:stylesheet>
  Old: 8 
  -----
  New: 7