XSLT-тест для проверки того, имеет ли <tr>родительский узел (<table>) определенный идентификатор - PullRequest
1 голос
/ 21 декабря 2011

Я боролся с правильным синтаксисом для этого, и он сводится к:

Как проверить, имеет ли атрибут родительского узла определенное значение?

Я трансформирую немного 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>

Вот код, который у меня есть. Мне либо нужно добавить дополнительные «и» к моему при тестировании, либо другой xsl:if или xsl:when, чтобы проверить атрибут таблицы. Для этого примера, давайте иметь таблицу id = "Transformable".

Для пояснения, я хочу выполнять вышеуказанное преобразование только тогда, когда таблица, к которой принадлежит <tr>, имеет идентификатор "Transformable".

Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

1 голос
/ 21 декабря 2011

Полагаю, вы можете использовать ось 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>
0 голосов
/ 21 декабря 2011

Вы также можете использовать селектор .., который обозначает родительский

<xsl:when test="..[@colspan='2']">
0 голосов
/ 21 декабря 2011

Вы должны попробовать что-то вроде (в вашем предложении теста):
parent :: table [@id = 'Transformable']

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...