XSLT测试以检查父节点()是否具有特定ID <table> </table>

时间:2011-12-21 10:02:18

标签: css xml xslt xpath xhtml

我一直在努力解决这个问题的正确语法,它归结为:

如何测试父节点的属性是否具有特定值?

我正在改造一些XHTML。我模板匹配<tr>以重新格式化该行中某些单元格的colspan属性。为了进一步确信这只会出现在某些表中,我需要检查<table>所属的<tr>是否具有特定的id属性值。

<xsl:template match="tr">
<tr>
  <xsl:choose>
    <xsl:when test="(count(td[@colspan='2'])=2 and count(td)=3)">
        <td colspan="1">
          <xsl:copy-of select="td[1]/node()" />
        </td>
        <td colspan="4">
          <xsl:copy-of select="td[2]/node()" />
        </td>
    </xsl:when>
      <xsl:otherwise>
        <xsl:copy-of select="@*|node()" />
      </xsl:otherwise>
  </xsl:choose>
</tr>
</xsl:template>

这是我到目前为止的代码。我要么在测试时添加“ands”,要么在另一个xsl:ifxsl:when添加“ands”以检查表属性。对于这个例子,让我们得到表id =“Transformable”。

为了澄清,我只希望在<tr>所属的表具有“可转换”的id时进行上述转换。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

我猜您可以在模板匹配定义中使用parent轴。

<xsl:template match="tr[parent::table/@id = 'Transformable']">
  This template matches only 'tr' within a 'table' with 'id' attribute which equals 'Transformable'.
</xsl:template>

更新:对于复杂的嵌套(如果table不是tr的直接父级) - 您可以使用ancestor轴。

<xsl:template match="tr[ancestor::table/@id = 'Transformable']">
  This template matches only 'tr' within a 'table' with 'id' attribute which equals 'Transformable'.
</xsl:template>

答案 1 :(得分:0)

你应该尝试一下(在你的测试条款中):
    parent :: table [@id ='Transformable']

答案 2 :(得分:0)

您也可以使用代表父

的..选择器
<xsl:when test="..[@colspan='2']">