如何使用xslt 2.0根据我的特定条件计算所有<w:p>节点?</w:p>

时间:2011-09-27 09:06:52

标签: xml xslt xpath

这是我的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

所以,现在我只想在<w:p>标记内计算所有前面的<w:body>个节点。例如,现在我们有<w:body>个节点。

逻辑:2

然后如果<w:tbl><w:body>内),则计算<w:p>内的所有<w:tbl>,直到当前节点到达。

所以,预期的决赛是:7。

我已经为此撰写了查询......这是错误的计算。

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

它被写为8.因为它也会在<w:p>内计算<w:p>(参见我的代码中的忽略大小写)。我不想要它。

我需要总计数,例如 logic1 + logic2

请帮我解决这个问题......

1 个答案:

答案 0 :(得分:2)

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

如果是这样,那么你需要修改for语句,只包括 w:p 元素,它没有 w:p 元素作为祖先。

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

这应该返回值7而不是8.顺便说一句,我假设当前节点 para8

因此,假设以下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>

如果您使用以下XSLT

<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