Как сделать код более красивым (компактный)?
<xsl:template match="part">
<table class="part">
<xsl:if test="name != ''">
<tr>
<td>Название</td><td><xsl:value-of select="name"/></td>
</tr>
</xsl:if>
<xsl:if test="model != ''">
<tr>
<td>Модель</td><td><xsl:value-of select="model"/></td>
</tr>
</xsl:if>
<xsl:if test="year != ''">
<tr>
<td>Год</td><td><xsl:value-of select="year"/></td>
</tr>
</xsl:if>
<xsl:if test="glass_type != ''">
<tr>
<td>Тип</td><td><xsl:value-of select="glass_type"/></td>
</tr>
</xsl:if>
<xsl:if test="scancode != ''">
<tr>
<td>Сканкод</td><td><xsl:value-of select="scancode"/></td>
</tr>
</xsl:if>
<xsl:if test="eurocode != ''">
<tr>
<td>Еврокод</td><td><xsl:value-of select="eurocode"/></td>
</tr>
</xsl:if>
<xsl:if test="coment != ''">
<tr>
<td>Комментарий</td><td><xsl:value-of select="coment"/></td>
</tr>
</xsl:if>
<xsl:if test="glass_size != ''">
<tr>
<td>Размер</td><td><xsl:value-of select="glass_size"/></td>
</tr>
</xsl:if>
<xsl:if test="vendor != ''">
<tr>
<td>Производитель</td><td><xsl:value-of select="vendor"/></td>
</tr>
</xsl:if>
<xsl:if test="trademark != ''">
<tr>
<td>Торговая марка</td><td><xsl:value-of select="trademark"/></td>
</tr>
</xsl:if>
<xsl:if test="fprice != ''">
<tr>
<td>Цена</td><td><xsl:value-of select="fprice"/></td>
</tr>
</xsl:if>
</table>
</xsl:template>
Обновление:
я записал:
<my:translations xmlns:my="my:my">
<w e="name" r="Название"/>
<w e="model" r="Модель"/>
<w e="year" r="Год"/>
<w e="glass_type" r="Тип"/>
<w e="scancode" r="Сканкод"/>
<w e="eurocode" r="Еврокод"/>
<w e="comment" r="Комментарий"/>
<w e="glass_size" r="Размер"/>
<w e="vendor" r="Производитель"/>
<w e="trademark" r="Торговая марка"/>
<w e="fprice" r="Цена"/>
</my:translations>
<xsl:value-of select="count(document('')//w)"/>
Дает 0.
Это преобразование (44 строки, 14 из которых являются словарем):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="my:my" exclude-result-prefixes="my">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kTranslate"
match="w/@r" use="../@e"/>
<my:translations>
<w e="name" r="Название"/>
<w e="model" r="Модель"/>
<w e="year" r="Год"/>
<w e="glass_type" r="Тип"/>
<w e="scancode" r="Сканкод"/>
<w e="eurocode" r="Еврокод"/>
<w e="comment" r="Комментарий"/>
<w e="glass_size" r="Размер"/>
<w e="vendor" r="Производитель"/>
<w e="trademark" r="Торговая марка"/>
<w e="fprice" r="Цена"/>
</my:translations>
<xsl:template match="part">
<table class="part">
<xsl:apply-templates/>
</table>
</xsl:template>
<xsl:template match="part/*">
<xsl:variable name="vName" select="name()"/>
<xsl:variable name="vRName">
<xsl:for-each select="document('')">
<xsl:value-of select="key('kTranslate', $vName)"/>
</xsl:for-each>
</xsl:variable>
<tr>
<td><xsl:value-of select="$vRName"/></td>
<td><xsl:value-of select="."/></td>
</tr>
</xsl:template>
</xsl:stylesheet>
при применении к этому XML-документу :
<object>
<part>
<name>FooName</name>
<model>FooName</model>
<year>FooName</year>
<glass_type>Fooglass_type</glass_type>
<scancode >Fooscancode</scancode>
<eurocode>Fooeurocode</eurocode>
<comment>Foocomment</comment>
<glass_size>Fooglass_size</glass_size>
<vendor>Foovendor</vendor>
<trademark>Footrademark</trademark>
<fprice>Foofprice</fprice>
</part>
</object>
дает желаемый, правильный результат :
<table class="part">
<tr>
<td>Название</td>
<td>FooName</td>
</tr>
<tr>
<td>Модель</td>
<td>FooName</td>
</tr>
<tr>
<td>Год</td>
<td>FooName</td>
</tr>
<tr>
<td>Тип</td>
<td>Fooglass_type</td>
</tr>
<tr>
<td>Сканкод</td>
<td>Fooscancode</td>
</tr>
<tr>
<td>Еврокод</td>
<td>Fooeurocode</td>
</tr>
<tr>
<td>Комментарий</td>
<td>Foocomment</td>
</tr>
<tr>
<td>Размер</td>
<td>Fooglass_size</td>
</tr>
<tr>
<td>Производитель</td>
<td>Foovendor</td>
</tr>
<tr>
<td>Торговая марка</td>
<td>Footrademark</td>
</tr>
<tr>
<td>Цена</td>
<td>Foofprice</td>
</tr>
</table>
Обратите внимание :
Словарь помещен в глобальный элемент с пространством имен - только в демонстрационных целях, чтобы иметь возможность представить все в одной таблице стилей.
На практике словарь будет занимать свой собственный XML-файл . Затем к нему будет обращаться:
<xsl:variable name="vRName">
<xsl:for-each select="document('dictionaryFileName.xml')">
<xsl:value-of select="key('kTranslate', $vName)"/>
</xsl:for-each>
</xsl:variable>
Если узлы в исходном XML появляются в том же порядке, что и ваш набор тестов if, или порядок вывода не важен, то вы можете использовать xsl:apply-templates select="*" mode="tr"/>
и написать шаблон типа
<xsl:template match="*" mode="tr">
<tr>
<td>...</td><td><xsl:value-of select="." /></td>
</tr>
</xsl:template>
В первом td
(...). ...), вы можете либо использовать xsl:choose
& xsl:when
, с ключом local-name(.)
или другой шаблон для перевода в кириллицу.
Если порядок входного xml отличается, а порядок выходного xml важен, то это решение не будет работать.