2013-02-07 87 views
1

我試圖找到一種方法來返工此轉換的地方,我沒有使用ancestor::軸在我的Xpath:避免使用「祖先::」的XPath軸

<xsl:template match="p[ancestor::p]"> 
    <xsl:apply-templates select="node() except ppr" /> 
</xsl:template> 

源的例子:

<root> 
    <p> 
    <p/> 
    <section> 
     <p/> 
    </section> 
    <ppr/> 
    <content/> 
    <p/> 
    <picture/> 
    </p> 
</root> 

所需的輸出:

<root> 
    <p> 
    <section> 
    </section> 
    <ppr/> 
    <content/> 
    <picture/> 
    </p> 
</root> 

我無法用明確的XPath或定位抓住這些<p>元素作爲它們的位置是隨機的,並且在我的原始源文檔中沒有圖案。

我試圖不使用ancestor::的原因是因爲我使用的XSLT處理器花費了30-50秒來評估Xpath表達式。 我不希望這個問題是關於我正在使用的XSLT處理器或其他實現與我的設置,而是專注於手頭的問題:有沒有什麼辦法可以在我的上述變換中不使用ancestor::

在此先感謝。

+1

是否有您只使用XSLT的2.0(標籤暗示這一點)的要求? xslt標籤意味着任何版本都可以使用。 –

+0

@Ryan蓋茨,對不起瑞安這有點誤導,這只是XSLT-2.0。 – Laterade

+4

爲什麼不使用'// p // p'? – BeniBela

回答

3

竟然是簡單的:

//p//p 
+2

在匹配模式中,前導「//」是不必要的:它唯一的作用是確保只有在「p」元素是匹配完整文檔的一部分時才匹配,並且在您的情況下這個測試幾乎肯定是多餘的(並且會增加幾微秒)。 –