0

docx 操作用のライブラリである phpdocx.com を使用しているときに、xpath と docx に関する私の貧弱な知識では解決できない問題に出くわしました。

phpdocx には、完全なブロックをマークするために使用されるいわゆるブロック変数があります。

$BLOCK_foo.bar$
Here comes a value
$BLOCK_foo.bar$

このようなブロックを見つけて削除するために、彼ら (phpdocx) は次の xpath 式を使用します。

//w:p[w:r/w:t[text()[contains(.,"BLOCK_foo.bar")]]]

それぞれの docx スニペットはここにあります: https://gist.github.com/anonymous/6bd998117b1a493dbaf7

それで、私はそれをデバッグしました、そして上記のXPathクエリは1つのノードを見つけますw:p.

最初の質問は、確かに: 一致するものが 1 つしか見つからないのに、実際には 2 つ (「開始」ブロックと「終了」ブロック) があるのはなぜですか。その上、BLOCK_ の発生は、そのブックマークのせいで破られています。それはどのように機能しますか?

しかし、私が持っている実際の質問は、私は聞いていませんが、のようなブロック名です$BLOCK_foo.bar(20).baz$

それぞれの xpath は次のとおりです。

//w:p[w:r/w:t[text()[contains(.,"BLOCK_foo.bar(20).baz")]]]

これは期待どおりに機能しません。2 つのノード (両方ともw:p) が見つかります。どこで、私はそれをクロスチェックしました、

//w:p[w:r/w:t[text()[contains(.,"BLOCK_foo.bar20.baz")]]]

.. で正しく動作する$BLOCK_foo.bar20.bazので、最後に、式の括弧の発生に問題があると思いますか? 一方、contains()値は引用符で囲まれているため、問題にはならないと思います。しかし、たとえば一重引用符もcontains()式で問題を引き起こす可能性があることを読みました...

関連する PHP コード ブロックはhttps://gist.github.com/anonymous/490418104fdf5cd1a791です。具体的な XML の例は、 http: //gist.github.com/anonymous/07eeddeb7d2f3c7db55bにあります。16行目から74行目までの最初の「ブロック」は正常に機能しますが、101行目から166行目までは機能しません。唯一の違いは括弧です...

私がここで何ができるか考えていますか?

4

2 に答える 2

0

わかりました。括弧は実際にはまったく問題ではありません.PHPDocxがブロック置換をどのように処理するかを知りませんでした.

. _ _ \$BLOCK_VARIABLE\$.+?\$BLOCK_VARIABLE\$_ そのため、XML などの出現箇所はすべて取り除かれ、単一の $VARIABLE$ に置き換えられます。

次のステップでは、XPath を介して変数の出現箇所を検索し、親段落ノードを削除します。

于 2015-02-02T16:42:03.590 に答える