【问题标题】:XPath: how to select node that have a sibling containing text?XPath:如何选择具有包含文本的兄弟节点的节点?
【发布时间】:2015-02-16 05:21:25
【问题描述】:

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

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

文档中的表格单元格文本使用元素 <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 来查找和处理这样的表行,但不幸的是它只找到那些&lt;w:tr&gt; 元素在第一个位置有&lt;w:t&gt;,即它不起作用对于这样的结构:

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

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

附:由于系统设计,我仅限于 XSLT 1.0 =(

【问题讨论】:

    标签: xpath xslt-1.0 siblings


    【解决方案1】:

    此时我将 xsl:template 与 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')]]">
    

    【讨论】:

    • 谢谢,这对双方都有帮助
    • 不错的 Xpath 表达式,+1
    最近更新 更多