【发布时间】:2015-01-29 19:36:13
【问题描述】:
使用用于 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 sn-p 可以在这里找到:https://gist.github.com/anonymous/6bd998117b1a493dbaf7
所以,我已经对其进行了调试,上面的 XPath 查询找到了 one 节点 w:p。
第一个问题,诚然:为什么它只找到一个匹配但实际上有两个(“开始”和“结束”块)。 此外,由于那个书签东西,BLOCK_ 的出现被撕掉了。这到底是怎么回事?
但我的实际问题是,我有,不要问,像 $BLOCK_foo.bar(20).baz$ 这样的块名称。
这个的xpath分别是
//w:p[w:r/w:t[text()[contains(.,"BLOCK_foo.bar(20).baz")]]]
这没有按预期工作,它找到了两个节点(虽然都是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 行没有,我看到的唯一区别是括号......
你知道我可以在这里做什么吗?
【问题讨论】:
标签: xml xpath openxml docx phpdocx