2015-04-29 26 views
0

我有一個關於XSLT XPath性能的問題。如果我們看下面的例子。在我的場景中,什麼是最好的XSLT XPath性能?

哪個下列選項中具有最佳的性能:

<xsl:for-each select="//cd"> 

<xsl:for-each select="//catalog/cd"> 

XML數據:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <catalog> 
     <cd> 
      <title>Empire Burlesque</title> 
      <artist>Bob Dylan</artist> 
     </cd> 
     <cd> 
      <title>Hide your heart</title> 
      <artist>Bonnie Tyler</artist> 
     </cd> 
    </catalog> 
    <catalog> 
     <cd> 
      <title>Greatest Hits</title> 
      <artist>Dolly Parton</artist> 
     <cd> 
      <title>Still got the blues</title> 
      <artist>Gary Moore</artist> 
     </cd> 
    </catalog> 
</root> 

XSLT樣式表:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
    <html> 
    <body> 
    <h2>My CD Collection</h2> 
    <table border="1"> 
     <tr bgcolor="#9acd32"> 
     <th>Title</th> 
     <th>Artist</th> 
     </tr> 
     <xsl:for-each select="//cd"> 
     <tr> 
     <td><xsl:value-of select="title" /></td> 
     <td><xsl:value-of select="artist" /></td> 
     </tr> 
     </xsl:for-each> 
    </table> 
    </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 

這是最好的表現嗎?

(我做了這個小的一個簡單的例子,在我的實際情況下,我有很多更復雜的數據意象結構)

+1

您的輸入文檔不是格式良好的XML。請編輯你的問題。 –

+0

感謝您的輸入,我糾正了這一點:) –

+0

通常,顯式路徑比使用後代軸更有效率。 –

回答

1

這個問題唯一可能的答案是「它取決於處理器」。通常你應該避免使用//,但是聰明的處理器可能能夠優化簡單的絕對路徑(例如,使用散列表按名稱查找節點)的速度比完全指定的/root/catalog/cd更快。

你必須在你的特定數據上分析你的特定處理器。

+0

感謝您的意見,我的真實案例更復雜,我想我可以做一些性能測試和測量所需的時間等等。儘量避免使用'\\\' –

+0

@MattiasAndersson請不要忘記接受一個答案(在我看來,這個答案在你的案例中更有用) - 或者編輯問題以澄清你的「真實案例」究竟是什麼。 –

+0

謝謝@MathiasMüller我接受了這個答案,但也要感謝你的回答,基於我的問題:) –

0

首先,你輸入的文檔沒有很好形成;其中一個cd元素未關閉,並且沒有包含其他所有元素的單個最外層元素。假設下面的輸入:

XML輸入現在

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <catalog> 
     <cd> 
      <title>Empire Burlesque</title> 
      <artist>Bob Dylan</artist> 
     </cd> 
     <cd> 
      <title>Hide your heart</title> 
      <artist>Bonnie Tyler</artist> 
     </cd> 
    </catalog> 
    <catalog> 
     <cd> 
      <title>Greatest Hits</title> 
      <artist>Dolly Parton</artist> 
     </cd> 
     <cd> 
      <title>Still got the blues</title> 
      <artist>Gary Moore</artist> 
     </cd> 
    </catalog> 
</root> 

,關於你的問題:你應該使用既不<xsl:for-each select="//cd">也不<xsl:for-each select="//catalog/cd">。事實上,你根本不應該使用xsl:for-each,這裏沒有理由使用它。你最好學習如何編寫單獨的模板來完成這項工作,就像下面的樣式表一樣。

XSLT樣式表

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="html" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="/root"> 
     <html> 
     <body> 
     <h2>My CD Collection</h2> 
     <table border="1"> 
      <tr bgcolor="#9acd32"> 
      <th>Title</th> 
      <th>Artist</th> 
      </tr> 
      <xsl:apply-templates/> 
     </table> 
     </body> 
     </html> 
    </xsl:template> 

    <xsl:template match="cd"> 
     <tr> 
      <xsl:apply-templates/> 
     </tr> 
    </xsl:template> 

    <xsl:template match="title|artist"> 
     <td> 
      <xsl:value-of select="."/> 
     </td> 
    </xsl:template> 

</xsl:stylesheet> 

雖然這是事實,輸出是完全一樣的,並且可以使用的xsl:for-eachfor-each是一個嚴重過度使用結構,特別是初學者 - 在地方模板將有更優雅。


至極具有最佳性能?

這個問題有沒有關係XSLT,它與嵌入在XSLT XPath表達式做:

<xsl:for-each select="//cd"> 
^^^^^^^^^^^^^^^^^^^^^^ ^^  XSLT 
         ^^^^  XPath 

通常,XPath表達式應該避免//descendant-or-self::)軸。您應該始終不願意使用//,並且只有在輸入文檔的結構完全不可預知或者您想要定位的元素被任意嵌套時才使用它。

+0

「*你不應該使用xsl:for-each,這裏沒有理由使用它。」*沒有理由不在這裏使用它。 –

+0

@ michael.hor257k我知道,我試圖說清楚它在這裏是一種有效的方法,但是在使用它們時這些模板通常會被忽略,這將是一個更優雅的解決方案。看看OP的代碼,我的印象是他們可能不知道單獨的模板。你想以什麼方式編輯我的答案? 「 –

+0

」*您希望我怎樣編輯我的答案?「*」我不知道,我認爲總的來說,這兩個問題都已經說得很清楚了 –

1

測量它並看看。除非你有一個測量框架,否則你甚至不應該開始研究改進性​​能的方法。如果你有一個測量框架,那麼你就不需要在這裏提出這個問題,如果你沒有問題,你就沒有辦法評估答案。

相關問題