Je ne suis pas familier avec XSLT et je veux donc savoir quelle est la meilleure pratique pour vérifier l'existence d'un attribut. Mon XML ressemble à ceci:XSLT si l'attribut existe/else
<root>
<languages>
<lang id="EN">English<lang>
<lang id="FR">French<lang>
<lang id="DE">German</lang>
</languages>
<items>
<item lang="EN">test 1</item>
<item>test 2</item>
<item lang="FR">item 3</item>
</items>
</root>
Notez que « lang'-attribut pour le » élément item' est facultatif.
Maintenant je veux boucler les éléments en utilisant un -loop, tout en vérifiant s'il a un attribut "lang". Si c'est le cas, je veux récupérer la chaîne entière en utilisant l'ID (par exemple, EN -> 'English'). Si l'attribut n'est pas défini, je veux écrire "No language set" ou quelque chose de semblable.
Maintenant j'utilise le code suivant mais je me pose la question si cela ne peut pas être fait de manière plus efficace.
<xsl:for-each select="//root/items/item">
<xsl:variable name="cur_lang" select="@lang" /> <!-- first I store the attr lang in a variable -->
<xsl:choose>
<xsl:when test="@lang"> <!-- then i test if the attr exists -->
<xsl:value-of select="//root/languages/lang[@id=$cur_lang]" /> <!-- if so, parse the element value -->
</xsl:when>
<xsl:otherwise>
No language set <!-- else -->
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
Des suggestions/conseils?
Pouvez-vous ajouter un exemple de Quelle devrait être la sortie exacte de l'entrée que vous avez fournie? –
Carlo, Vous avez oublié de fournir la sortie désirée - Je pensais que vous vouliez que la chaîne de langue étendue remplace la valeur actuelle de l'attribut 'lang'. Veuillez * modifier * la question et fournir le résultat souhaité lorsque la transformation est appliquée sur le document XML fourni. –