Jestem całkiem nowy w XSLT i dlatego chcę wiedzieć, jaka jest najlepsza praktyka sprawdzania istnienia atrybutu. Mój XML wygląda mniej więcej tak:XSLT, jeśli atrybut istnieje/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>
Należy zauważyć, że atrybut "lang" dla elementu "element" jest opcjonalny.
Teraz chcę przechodzić przez elementy używając -loop, sprawdzając czy ma "lang" -atrybut. Jeśli tak, chcę pobrać cały ciąg za pomocą identyfikatora (np. EN -> "English"). Jeśli atrybut nie jest ustawiony, chcę napisać "Brak zestawu językowego" lub coś podobnego.
Teraz używam następującego kodu, ale pytam siebie, czy nie można tego zrobić w bardziej efektywny sposób.
<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>
Wszelkie sugestie/porady?
można dodać przykład jakie dokładnie dane wyjściowe powinny otrzymać dane wejściowe dostarczone? –
Carlo, zapomniałeś podać żądane wyjście - Myślałem, że chcesz, aby rozszerzony ciąg znaków językowych zastąpił bieżącą wartość atrybutu "lang". Proszę * edytować * pytanie i podać pożądany wynik, gdy transformacja zostanie zastosowana w dostarczonym dokumencie XML. –