Не пытаясь это сделать: я бы подумал, что <xsl:when>
не может быть дочерним узлом <xsl:if>
без другого <xsl:choose>
между ними. Но что ты пытаешься сделать? Если я правильно понял, вы хотите запустить <call-template>
тогда и только тогда, когда (param/@id='1' and param/value='XML') or (param/@id='2' and param/value='HTTP') or (param/@id='3' and param/value='Y')
... попробуйте это в качестве тестового значения:
<xsl:if test="(param/@id='1' and param/value='XML') or (param/@id='2' and param/value='HTTP') or (param/@id='3' and param/value='Y')">
<xsl:call-template name="buildPayload"/>
</xsl:if>