2011-09-26 49 views
1

這是我的XML文件如何使用XSLT 2.0統計當前節點的所有<w:p>節點(在<w:body>之內)?

<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,此時...

我怎麼做幫助我得到這個...

+0

請問你能清楚的問題嗎?你提到什麼? – Kris

+0

@ Mr.K ::問題編輯...希望,蘭加想那樣... – Saravanan

+0

你有一個簡單的變通:)計數所有使用doc.selectNodes(XPath)的長度,從根引用。從選定的節點開始,現在只計算其餘的節點。找到差異。我知道這不是一個受人尊敬的解決方案,但它是一種解決方法 – Kris

回答

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) 
相關問題