Как уже упоминалось в комментариях if() then else
конструкция поддерживается только в XSLT/XPpath 2.0.
Мое предпочтение было бы использовать многословный, но читает:
<xsl:template match="some-node">
<div>
<xsl:attribute name="ID">
<xsl:choose>
<xsl:when test="string(@ID)">
<xsl:value-of select="@ID"/>
</xsl:when>
<xsl:otherwise>default</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
</div>
</xsl:template>
или, возможно, короче:
<xsl:template match="some-node">
<div ID="{@ID}">
<xsl:if test="not(string(@ID))">
<xsl:attribute name="ID">default</xsl:attribute>
</xsl:if>
</div>
</xsl:template>
Однако, если вы в скрытый код, вы можете:
<xsl:template match="some-node">
<div ID="{substring(concat('default', @ID), 1 + 7 * boolean(string(@ID)))}">
</div>
</xsl:template>
или:
<xsl:template match="some-node">
<div ID="{concat(@ID, substring('default', 1, 7 * not(string(@ID))))}">
</div>
</xsl:template>
В XSLT 2.0, да. В XSLT 1.0 нет - хотя есть * * способ построить однострочный в * некоторых * ситуациях. Отправьте фактический пример. –
добавил пример. – IMTheNachoMan