0

ここで推奨されているように、Word xml の xslt をリファクタリングしてパフォーマンスを向上させています。私はxsltに比較的慣れていません。次のステートメントが同等でないのはなぜですか?

フォーム1

<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:package はルートであり、pkg:part は直接の子であることに注意してください。

$styleNameForm1 は、祖先がattribute を持つ属性 equaling を持つ w:style 要素を取得すると述べていpkg:partます@pkg:name='/word/styles.xml'

フォーム 2 は、w:style 要素を取得し、その属性$styleNameが who are childrenpkg:package/pkg:par@pkg: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"/>

ありがとうございました。

4

2 に答える 2

2

w:stylesあなたの2番目のXPathは正しい軌道に乗っていますが、直接の子であるpkg:part(ここでは軸は冗長です)だけに一致しますがchild::、そうではないと思います。これはうまくいくはずです:

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

これは元の XPath よりも改善されていると思いますが、まだ//. wordprocessingML に関する私の知識はあまり豊富ではありませんが、すべて<w:style>の s が要素の<w:styles>子であり、要素のすべての子であるということ<pkg:xmlData>でしょうか? もしそうなら、これはうまくいくはずです(読みやすくするために2行に分割されています):

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

パフォーマンスを向上させるもう 1 つの可能性は、キーを使用することです。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" />

キー検索は一般に非常に効率的であるため、この 2 番目のオプションがパフォーマンスの面で優れている可能性があります。

于 2013-01-31T17:37:36.357 に答える
0

「//」で式を開始することが常に悪いと思い込まないでください。これは初期の頃は当てはまり、初期の頃からあまり進歩していないプロセッサにはまだ当てはまるかもしれませんが、Saxon の最新バージョンを含む一部のプロセッサは "//" を非常に効率的に処理します。このような変更を行う場合は、変更が効果的であることを示す測定を行うようにしてください。この種の表現では、キーを使用するとプラスの効果が得られる可能性が高くなりますが、一部のプロセッサは自動的にそれを行います。

于 2013-01-31T22:50:46.283 に答える