0

我有一个带有一系列标签和文本的 XML,

     <table-wrap id="t01"> <label>Tabela 1</label>aaaa <caption>...</caption>
         ...
     </table-wrap>

并且需要删除文本“aaaa”,即label标签的follow-sibling。我有这个任务的 XSLT 身份转换,比如

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

<xsl:template match="table-wrap/label::following-sibling/text()" />

问题是如何表达以下兄弟文本的XPath?

PS:示例的xpath是错误的,只是说明性的。我尝试table-wrap/label/following-sibling::text()和其他人一样,并且错误。

4

2 回答 2

2

我假设您想要删除文本,如果它们<label>位于同一级别的元素之后的任何位置。(如果您只想在它们紧跟在<label>元素之后删除它们,那是一个相当微不足道的更改。)

这个 XSLT 样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

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

  <!-- Matches any text nodes that are children of the table-wrap element, as long as
       they have a label element as a preceding sibling. -->
  <xsl:template match="table-wrap/text()[preceding-sibling::label]"/>
</xsl:stylesheet>

当应用于您的示例输入 XML 时,会产生以下输出:

<table-wrap id="t01">
  <label>Tabela 1</label><caption>...</caption></table-wrap>
于 2013-10-04T12:37:56.557 回答
1

aaaa字符串实际上是table-wrap节点的文本,因为它没有包含在另一个元素中。在这种情况下,您可以将模板匹配更新为以下内容。

<xsl:template match="table-wrap/text()" />
于 2013-10-04T12:37:40.477 回答