2010-05-27 12 views
1

Étant donné le code suivant:Trouver des nœuds spécifiques avec descendants xsl: clés

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

Je veux être en mesure de tester à l'aide d'un xsl: clé si la table spécifique a une colonne spécifique par nom. Par exemple, je veux savoir si une table a une colonne 'created_at' afin que je puisse écrire du code spécifique dans la transformation.

J'ai une clé générale qui va tester si une table a une colonne donnée par son nom, mais n'a pas compris comment la rendre spécifique à la table avec laquelle la transformation travaille actuellement.

<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> 

Donc je finis par 'vrai' pour toutes les tables. Toute orientation serait appréciée.

+0

Bonne question (+1). Voir ma réponse pour une solution complète. –

Répondre

1

La transformation suivante montre comment cela peut se faire:

<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> 

Lorsque cette transformation est appliquée sur le document XML fourni, le résultat voulu, correct produit:

true 
false 
+0

Merci Dimitre, vos idées sur xsl m'aident encore une fois =) – OpenDataAlex