是否可以选择仅包含子节点子集的节点?

时间:2011-02-27 18:14:45

标签: xslt xpath

我有一些XPath:

//tbody/tr[2]/td/div/table/tbody/tr[2]/td[position() > 1]

除了第一个子节点之外,它给了我一切。但是,它为我提供了td注释的节点列表。我想选择父tr节点,但删除了第一个子节点。

这只能使用xpath吗?

1 个答案:

答案 0 :(得分:4)

XPath是XML文档的查询语言。因此,它无法修改源XML文档的结构或创建新的XML文档。

仅使用XPath无法完成创建新修改文档的任务。

使用XSLT很容易实现

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="tr[2]/td[1]"/>
</xsl:stylesheet>

将此转换应用于以下XML文档时:

<table>
 <tr>
  <td>1</td>
  <td>2</td>
  <td>3</td>
 </tr>
 <tr>
  <td>1</td>
  <td>2</td>
  <td>3</td>
  <td>4</td>
 </tr>
</table>

生成了所需的正确结果(除了第二个<td>的第一个<tr>子项以外的所有复制节点):

<table>
   <tr>
      <td>1</td>
      <td>2</td>
      <td>3</td>
   </tr>
   <tr>
      <td>2</td>
      <td>3</td>
      <td>4</td>
   </tr>
</table>