<xsl:element name="input">
<xsl:attribute name="type">text</xsl:attribute>
<xsl:for-each select="@*">
<xsl:choose>
<xsl:when test="@id">
Этот тест проверяет, имеет ли текущий узел (атрибут) атрибут с именем id
.Поскольку атрибут не может иметь атрибуты сам по себе, тест никогда не будет успешным.
Вот краткое решение XSLT с использованием шаблонов, без <xsl:for-each>
и без условной логики :
<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:variable name="vNoLabelVal" select="'No Label Defined'"/>
<xsl:template match="textBox">
<xsl:value-of select="concat(@label, substring($vNoLabelVal, 1 div not(@label)))"/>
<input type="text">
<xsl:apply-templates select="@*"/>
</input>
</xsl:template>
<xsl:template match="textBox/@*">
<xsl:copy-of select="."/>
</xsl:template>
<xsl:template match="textBox/@id">
<xsl:attribute name="name">
<xsl:value-of select="concat('form_', .)"/>
</xsl:attribute>
</xsl:template>
<xsl:template match="textBox/@label"/>
</xsl:stylesheet>
когда это преобразование применяется к данному XML-документу :
<textBox id="Airfare" value="" label="text 1"/>
желаемый, правильный результат получается :
text 1<input type="text" name="form_Airfare" value="" />
при применении к этому XML-документу (отсутствует атрибут label
):
<textBox id="Airfare" value="" />
получен правильный результат :
No Label Defined<input type="text" name="form_Airfare" value="" />