Поиск определенных дочерних узлов с XSL: ключ - PullRequest
1 голос
/ 27 мая 2010

С учетом следующего кода:

<database>
    <table name="table1">
       <column name="id"/>
       <column name="created_at"/>
    </table>
    <table name="table2">
       <column name="id"/>
       <column name="updated_at"/>
    </table>
</database>

Я хочу иметь возможность проверить с помощью ключа xsl: если у конкретной таблицы есть определенный столбец по имени. Например, я хочу знать, есть ли в таблице столбец create_at, чтобы я мог написать конкретный код в преобразовании.

Я получил общий ключ, который будет проверять, есть ли в любой таблице заданный столбец по имени, но не выяснил, как сделать ее специфичной для таблицы, с которой в данный момент работает преобразование. 1008 *

    <xsl:key name="columnTest" match="column" use="@name"/>
 <xsl:for-each select="database/table">   
    <xsl:choose>
       <xsl:when test="key('columnTest', 'created_at')">
          <xsl:text>true</xsl:text>
       </xsl:when>
       <xsl:otherwise>
          <xsl:text>false</xsl:text>
       </xsl:otherwise>
    </xsl:choose>
</xsl:for-each>

Так что я получаю «true» для всех таблиц. Любое руководство будет оценено.

1 Ответ

1 голос
/ 28 мая 2010

Следующее преобразование показывает, как это можно сделать :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:output method="text"/>

 <xsl:key name="kTableByName"
  match="table" use="@name"/>

 <xsl:key name="kColumnByTable"
  match="column" use="concat(generate-id(..), '+', @name)"/>

 <xsl:template match="/">
  <xsl:value-of select=
   "boolean(key('kColumnByTable',
                 concat(generate-id(key('kTableByName', 'table1')),
                        '+',
                        'created_at'
                       )
               )
            )
   "/>

  <xsl:text>&#xA;</xsl:text>

  <xsl:value-of select=
   "boolean(key('kColumnByTable',
                 concat(generate-id(key('kTableByName', 'table1')),
                        '+',
                        'updated_at'
                       )
               )
            )
   "/>
 </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к предоставленному XML-документу, получается нужный, правильный результат :

true
false
...