如何匹配以下兄弟姐妹

时间:2013-10-09 10:40:16

标签: xpath xslt-1.0

这是我的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:p,其前面是w:tc并且没有跟随兄弟w:r,正好我想要第二个w:tc。编码我试过的,

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

我需要x路径为w:pPr没有后续兄弟

2 个答案:

答案 0 :(得分:3)

  

问题是w:pPr后跟w:超链接。现在我也忽略了w:超链接。

如果你想匹配一个没有以下兄弟元素w:pPr (无论名字如何),那么只需使用match模式

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

或等效(并略短)

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

答案 1 :(得分:2)

使用XPath简单明了,你必须过滤元素olny。您的filtring可以基于元素的内容(使用[]和括号内的路径)。使用过滤后的元素,您可以像使用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 :添加了超链接条件。