2013-01-31 28 views
0

我正在重構一個xslt for word xml以改進性能,建議使用here。我對xslt比較陌生。爲什麼下面的陳述不等同?如何重構這個具有//的xslt?

Form1中

<xsl:value-of select="//w:style[@w:styleId = $styleName][ancestor::pkg:part/@pkg:name='/word/styles.xml']"/> 

窗體2

<xsl:value-of select="/pkg:package/pkg:part[@pkg:name='/word/styles.xml']/child::w:style[@w:styleId = $styleName]" /> 

注意PKG:包是根PKG:一部分是直接孩子。

Form1表示獲取w:style元素,其屬性等於$styleName,其祖先的屬性爲pkg:part,屬性爲​​3210。

表2規定,獲得寬:風格元素與屬性等於$styleName誰是pkg:package/pkg:[email protected]:name='/word/styles.xml'

我試圖重寫的實際語句的孩子是這樣的一個:

<xsl:value-of select="//w:style[@w:styleId = $styleName][ancestor::pkg:part/@pkg:name='/word/styles.xml']/w:pPr/w:numPr/w:numId/@w:val"/> 

謝謝。

回答

2

你的第二個XPath是在正確的軌道上,但它只會匹配w:styles,它們是pkg:part的直接子代(child::軸在這裏是多餘的),我不認爲它們是。這應該工作:

/pkg:package/pkg:part[@pkg:name='/word/styles.xml']//w:style[@w:styleId = $styleName] 

,我認爲這是對初始的XPath的改進,但它仍然有它//。我對wordprocessingML的瞭解不是很廣泛,但是否所有<w:style>都是<w:styles>元素的子元素,它們都是<pkg:xmlData>元素的子元素?如果是的話,這應該工作(橫跨2線拆分爲便於閱讀):其他

/pkg:package/pkg:part[@pkg:name='/word/styles.xml'] 
           /pkg:xmlData/w:styles/w:style[@w:styleId = $styleName] 

一種可能性提高性能的方法是使用一個密鑰。在你的XSLT,你會定義一個關鍵是這樣的:

<xsl:key name="kStyle" match="w:style" use="@w:styleId" /> 

然後你就可以訪問的風格,你想是這樣的:

<xsl:value-of select="key('kStyle', $styleName) 
           [ancestor::pkg:part/@pkg:name = '/word/styles.xml'] 
           /w:pPr/w:numPr/w:numId/@w:val" /> 

鍵查找通常是非常有效的,所以這第二個選項可能在性能方面表現更好。

+0

感謝您的快速回復。您的第一個建議立即生效。也會嘗試你的第二個建議。再次感謝你。 – Natkeeran

+0

你的第二個建議適用於我嘗試的有限情況。 – Natkeeran

0

不要認爲用「//」開始表達式總是不好的。早期的情況一直如此,自早期以來處理器尚未進步的處理器可能仍然如此,但包括現代版本的薩克森處理器在內的一些處理器非常有效地處理「//」。如果您要進行此類更改,請確保您進行的測量顯示更改是有效的。對於這種表達方式,使用密鑰更有可能產生積極影響 - 儘管有些處理器甚至會自動爲您執行此操作。

+0

爲了擴大這一點,我剛剛看到這條推文:Markus Wiedenmaier @MWiedenmaier 10h xml 3MB在xslt 1.0中有很多//元素調用:saxon und msxsl〜3sek xalanj〜6min xalanc 10min + –