У меня очень специфическая проблема, когда я хочу иметь возможность извлечь значение атрибута по умолчанию для элемента, как показано в примере ниже.
Каждый элемент во входном XML содержит несколько дочерних элементов имени, один для представления основного имени, которое является значением атрибута по умолчанию (type = 'main'), и другое вторичное имя (type = 'short'). В основном имени не указано значение атрибута 'main'. Вот пример входного XML-файла с намеренно закомментированным первым элементом name, чтобы проиллюстрировать проблему дальше:
<?xml version="1.0"?>
<food_list>
<food_item>
<!--name>Apple</name-->
<name type="short">APL</name>
</food_item>
<food_item>
<name>Asparagus</name>
<name type="short">ASP</name>
</food_item>
<food_item>
<name>Cheese</name>
<name type="short">CHS</name>
</food_item>
</food_list>
XSD для NameType выглядит следующим образом:
<complexType name="NameType">
<simpleContent>
<extension base="TextualBaseType">
<attribute name="type" use="optional" default="main">
<simpleType>
<restriction base="NMTOKEN">
<enumeration value="main"/>
<enumeration value="short"/>
<enumeration value="alternative"/>
</restriction>
</simpleType>
</attribute>
</extension>
</simpleContent>
</complexType>
XSLT для преобразования входного XML и извлечения Основного имени и Сокращенного имени приведен ниже:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="food_list">
<table>
<tr style="background-color:#ccff00">
<th>Food Name</th>
<th>Food Short Name</th>
</tr>
<xsl:for-each select="food_item">
<tr style="background-color:#00cc00">
<td><xsl:value-of select="name"/></td>
<td><xsl:value-of select="name[@type='short']"/></td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
Когда входной XML преобразуется, Первичное имя для первого элемента питания неправильно выбирается из элемента с type = 'short'. Вопрос: Как ограничить первый оператор value-of в xslt значением only для выбора значений имени, когда определен элемент по умолчанию?