XPath:如何 select 具有包含文本的兄弟节点的节点?

XPath: how to select node that have a sibling containing text?

我有一个 Word XML 文档,它是一个报告模板。在文档中放置真实数据的地方(在生成报告时)有数据标识符。

问题是:我应该使用什么 xpath 表达式将指定有给定数据标识符(即包含内部给定文本的单元格)的 table 行放入 <xsl:for-each> 元素?

Table 文档中的单元格文本使用元素 <w:t> 嵌套到 <w:r>,然后是 <w:p><w:tc><w:tr> 最后进入 <w:tbl>。所以结构看起来像这样:

<w:tbl>
  <w:tr>
    <w:tc>
      <w:p>
        <w:r>
          <w:t>dataIdentifier</w:t>
        </w:r>
      </w:p>
    </w:tc>
  </w:tr>
</w:tbl>

此时我使用 xsl:templatematch=w:tr[contains(.//w:t,'dataIdentifier')] 和 Xalan 来查找和处理这样的 table 行,但不幸的是它只找到那些 <w:tr> 具有 <w:t> 在第一个位置,即它不适用于这样的结构:

<w:tbl>
  <w:tr>
    ...
      <w:t>some text</w:t>
    ...
    ...
      <w:t>dataIdentifier</w:t>
    ...
  </w:tr>
</w:tbl>

什么是正确的 XPath 表达式,它将检查所有位置的 <w:tr> 兄弟姐妹?

P.S。由于系统设计,我仅限于 XSLT 1.0 =(

At this time I use xsl:template with match=w:tr[contains(.//w:t,'dataIdentifier')]

试试看:

<xsl:template match="w:tr[.//w:t[contains(., 'dataIdentifier')]]">

--
注意:如果知道 w:t 的完整路径,最好明确说明:

<xsl:template match="w:tr[w:tc/w:p/w:r/w:t[contains(., 'dataIdentifier')]]">