как считать всеузлы, основанные на моих специфических критериях, использующих xslt 2.0? - PullRequest
0 голосов
/ 27 сентября 2011

Это мой 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> tag. Например, теперь у нас есть 5 узлов из <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 Ответ

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

Звучит так, как будто вы хотите игнорировать w: p элементы, которые вложены в другие w: p элементы.

Если это так, то вам нужно изменить оператор так, чтобы он включал только элемент 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...