4

这是我的xml,

 <w:tc>
    <w:p>
      <w:pPr></w:pPr>
      <w:r></w:r>
    </w:p>
 </w:tc>
 <w:tc>
    <w:p>
      <w:pPr></w:pPr>
    </w:p>
 </w:tc>

我想匹配前面有 w:tc 并且没有后续兄弟 w:r 的 w:p,确切地说,我想要第二个 w:tc。编写我尝试过的代码,

  <xsl:template match="w:pPr[ancestor::w:p[ancestor::w:tc] and not(following-sibling::w:r)]">

我需要 w:pPr 的 xpath 没有后续兄弟

4

2 回答 2

6

问题是当 w:pPr 后跟 w:hyperlink 时。现在我也忽略了 w:hyperlink。

如果你想匹配一个w:pPr根本没有后续兄弟元素(不管名称),那么只需使用一个match模式

w:pPr[ancestor::w:p[ancestor::w:tc] and not(following-sibling::*)]

或等效地(并且略短)

w:tc//w:p//w:pPr[not(following-sibling::*)]
于 2013-10-09T11:49:02.743 回答
2

使用 XPath 简单明了,您必须过滤 olny 元素。您的过滤可以基于元素的内容(使用[]括号内的路径)。使用过滤后的元素,您可以像使用 XML 树一样工作(再次开始过滤或选择最终元素)。

在您的情况下,首先您必须选择正确tc的元素(根据需要过滤元素):

  • 基于元素的计数://tc[count(./p/*) = 1], 或
  • 基于不存在的r元素://tc[not(./p/r)],或
  • 基于不存在的rhyperlink元素://tc[not(./p/r) and not(./p/hyperlink)]
  • 基于现有pPr和不存在r(这不是必需的,因为pPr在第二步中进行了过滤)://tc[./p/r and not(./p/r)]

它返回以下 XML。

<tc> 
  <p> 
    <pPr>pPr</pPr> 
  </p> 
</tc>

然后简单地说你想从新的 XML 中得到什么:

  • 你想要pPr元素吗?采用:/p/pPr

全部一起:

//tc[count(./p/*) = 1]/p/pPr

或者

//tc[not(./p/r)]/p/pPr

注意//表示在文档中的任何位置查找元素。

更新 1:添加了超链接条件。

于 2013-10-09T11:20:57.363 回答